将熊猫数据框与计算合并

时间:2021-06-28 14:57:28

标签: python pandas dataframe

我有几个 Pandas 数据框。

DF A:

<头>
id 日期 平均 计数
1 27/06/2021 10 5
1 28/06/2021 12 4

DF B:

<头>
id 日期 平均 计数
1 27/06/2021 8 5
1 28/06/2021 6 6
1 29/06/2021 11 10
2 27/06/2021 3 10
2 28/06/2021 3 10

基本上,这些是从各种大数据源聚合的中间表的简化。如何合并这些数据框,以便 id+date 的平均值是正确的(即它是 (avg1 * count1 + avg2 * count2)/(count1 + count2))

上面两个的预期DF应该是这样的:

<头>
id 日期 平均 计数
1 27/06/2021 9 10
1 28/06/2021 8.4 10
1 29/06/2021 11 10
2 27/06/2021 3 10
2 28/06/2021 3 10

谢谢。

2 个答案:

答案 0 :(得分:3)

你可以这样做

s = pd.concat([df1,df2])
cnt = s.groupby(['id','date'])['count'].sum()
amount =  (s['avg']*s['count']).groupby([s['id'],s['date']]).sum()/cnt
amount.name='avg'
out = pd.concat([cnt,amount],axis=1).reset_index()
out
Out[34]: 
   id        date  count   avg
0   1  27/06/2021     10   9.0
1   1  28/06/2021     10   8.4
2   1  29/06/2021     10  11.0
3   2  27/06/2021     10   3.0
4   2  28/06/2021     10   3.0

答案 1 :(得分:3)

另一种方式:

out=df1.merge(df2,on=['id','date'],suffixes=('_1','_2'),how='left'))

现在开始计算:

out['avg']=out.eval("(avg_1*count_1+avg_2*count_2)/(count_1+count_2)")
out['count']=out.eval("count_1+count_2")
out=out.drop(out.filter(like='_').columns,1)

最后:

df2.update(out)