我希望将一组数据与该数据的汇总汇总进行比较。
在下面的示例中,我想知道每家餐厅与所有餐厅的总收入相比赚了多少钱。我想白天知道这一点。如果餐厅当天关门,我仍然想返回当天的名称和总账单列中带有 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/