我的数据框采用“宽”格式,这样列包含不同实体的数据,行是日期,例如随时间变化的产品成本:
import pandas as pd
cost = pd.DataFrame([[10,20,30,40],[11,22,33,44],[111,222,333,444]], columns=['Knife','Fork','Spoon','Spatula'], index=pd.date_range('2022-01-01','2022-01-03'))
Knife Fork Spoon Spatula
2022-01-01 10 20 30 40
2022-01-02 11 22 33 44
2022-01-03 111 222 333 444
我有一个类似的数据框,将每个数据点放在两组(1 或 2)之一中:
grp = pd.DataFrame([[1,2,1,2],[1,1,2,2],[2,1,1,2]], columns=['Knife','Fork','Spoon','Spatula'], index=pd.date_range('2022-01-01','2022-01-03'))
Knife Fork Spoon Spatula
2022-01-01 1 2 1 2
2022-01-02 1 1 2 2
2022-01-03 2 1 1 2
我想对每个日期的每个组进行聚合分组方式。因此,这是我想要的输出,显示第 1 组和第 2 组的平均值:
avg = pd.DataFrame([[(10+30)/2,(20+40)/2],[(11+22)/2,(33+44)/2],[(111+444)/2,(222+333)/2]], columns=[1,2], index=pd.date_range('2022-01-01','2022-01-03'))
1 2
2022-01-01 20.0 30.0
2022-01-02 16.5 38.5
2022-01-03 277.5 277.5
我尝试过融化每个数据框、重建索引、合并、groupby、聚合和数据透视,但这真的是一团糟(尤其是重建索引)。
在我看来,必须有更好的方法来聚合这种“广泛”的数据?我的实际数据更大(并且有更多的组),因此需要效率。
我怎样才能最有效地获得我想要的输出?
最佳答案
计划是stack
每一帧,join
它们,groupby
按日期/组,unstack
:
dfm = cost.stack().to_frame(name = 'cost').join(grp.stack().to_frame(name = 'group'))
dfm.reset_index().groupby(['level_0','group']).mean().unstack()
输出:
cost
group 1 2
level_0
2022-01-01 20.0 30.0
2022-01-02 16.5 38.5
2022-01-03 277.5 277.5
关于python - 带有 "Wide"数据的 Pandas groupby,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71071899/