python - 带有 "Wide"数据的 Pandas groupby

标签 python pandas pandas-groupby

我的数据框采用“宽”格式,这样列包含不同实体的数据,行是日期,例如随时间变化的产品成本:

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/

相关文章:

python - 如何在 Pygame 中设置延迟/冷却时间?

python - 使用Python计算坡度的程序

python - 根据特定的月份值和以另一列为条件过滤 Pandas 数据框

python - 如何将 .sav 文件转换为 csv 文件

python - Matplotlib 在 GUI 中崩溃

python - 根据属性计算类的实例

python - Matplotlib - 跨子图的 axvlines

python - Pandas - 有条件的 groupby

python - Pandas groupby 将 ndarrays 的嵌套数组分配回数据帧

python - Pandas 分组 : How to GroupBy and Aggregate data to show only the top 3 values of a field by count