python - 数据框的 Pandas 合并

标签 python pandas join dataframe merge

我希望将一组数据与该数据的汇总汇总进行比较。

在下面的示例中,我想知道每家餐厅与所有餐厅的总收入相比赚了多少钱。我想白天知道这一点。如果餐厅当天关门,我仍然想返回当天的名称和总账单列中带有 NaN(或零)的餐厅名称。

(我知道还有其他方法可以做到这一点,但请考虑这是一个关于合并的问题,因为有一个原因需要使用两个不同的数据帧来完成)

所以,我想要的输出是:

day   total_bill_x   restaurant   total_bill_y

Fri        651.76   DINER A     325.88 
Sat      3,556.80   DINER A   1,778.40 
Sun      1,627.16   DINER A        NaN 
Thur     2,192.66   DINER A   1,096.33 

但是由于外连接工作方式的性质,我能得到的最远的结果将返回如下内容:

day   total_bill_x   restaurant   total_bill_y

Fri        651.76   DINER A   325.88 
Sat      3,556.80   DINER A   1,778.40 
Sun      1,627.16   NaN        NaN 
Thur     2,192.66   DINER A   1,096.33 

问题是我能想到没有任何合并可以支持这种类型的输出 - 如果没有匹配,DINER A 就会消失。

我的真实数据集将包含数十家餐厅,情况会变得更糟。

如果不匹配,是否可以执行外连接,从要连接的表中获取字段?如何查看较大表中的所有记录以查找较小表中不匹配的记录?

我认为这是一个有趣的问题,并且绝对对其他人如何处理感兴趣。谢谢!

示例代码如下:

import pandas as pd
df=pd.read_csv("https://raw.githubusercontent.com/wesm/pydata-book/master/ch08/tips.csv", sep=',')
df2=pd.read_csv("https://raw.githubusercontent.com/wesm/pydata-book/master/ch08/tips.csv", sep=',')

df=df[df['day']!="Sun"]
df['restaurant']="DINER A"
df3=df.append(df2)
df_output=df.groupby(['restaurant','day'])[['total_bill']].sum().reset_index()
df_output2=df3.groupby(['day'])[['total_bill']].sum().reset_index()

pd.merge(df_output2,df_output, on='day', how="outer")

最佳答案

设置

df = pd.read_csv(
    "https://raw.githubusercontent.com/wesm/pydata-book/master/ch08/tips.csv", sep=',')

d1 = pd.concat([df.query('day != "Sun"'), df], keys=['DINER A', 'DINER B']) \
    .rename_axis(['restaurant', None]).reset_index('restaurant')

构建包含所有餐厅和日期的 pd.MultiIndex

mux = pd.MultiIndex.from_product([
        d1.restaurant.unique(),
        d1.day.unique()
    ], names=['restaurant', 'day'])

groupby + join + 重新索引

d2 = d1.groupby(['day']).total_bill.sum()
d3 = d1.groupby(['restaurant', 'day'])[['total_bill']].sum()

d3.reindex(mux).join(d2, lsuffix='_x', rsuffix='_y').reset_index()

  restaurant   day  total_bill_x  total_bill_y
0    DINER A   Sat       1778.40       3556.80
1    DINER A  Thur       1096.33       2192.66
2    DINER A   Fri        325.88        651.76
3    DINER A   Sun           NaN       1627.16
4    DINER B   Sat       1778.40       3556.80
5    DINER B  Thur       1096.33       2192.66
6    DINER B   Fri        325.88        651.76
7    DINER B   Sun       1627.16       1627.16

关于python - 数据框的 Pandas 合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42819311/

相关文章:

python - 在 YouTube V3 API 上突然获得 Oauth 2.0 同意的 403(禁止访问)

python - 对象 (ctx: )>"上的 ValueError : Invalid field u'field' in leaf "<osv.ExtendedLeaf: (u' field', u'in', [59]) - Odoo v8

php - MySQL 查询的影响

MySQL 优化带有 IN 子句和多个 ID 的 LEFT JOIN

python - django-tenant-schema 为所有租户启用管理模块

c# - 将 C# REST API 安全地暴露给脚本语言,例如 Python

python - Xlsxwriter - 将字符串写入给定参数的单元格

python - 如何将不同时区的 tz_convert 应用于 pandas 数据框中的不同行

Python Pandas 检查一个值是否在同一天出现多次

arrays - $lookup 两层