首页 > 解决方案 > Pandas:结合重采样和分组。在将它们汇总到时间箱中之前,如何平均同一组中的值?

问题描述

我有与时间戳和定制组相关联的表格数据(由 col1、col2、...描述)。例子:

           Group  Col1  Col2  Col3
Time
2020-05-18     A    10    20    30
2020-05-18     B    10    20    30
2020-05-18     C    10    20    30
2020-05-19     A    10    20    30
2020-05-19     B    10    20    30
2020-05-19     C    10    20    30
2020-05-20     A    10    20    30
2020-05-20     B    10    20    30
2020-05-20     C    10    20    30
2020-05-21     A    10    20    30
2020-05-21     B    10    20    30
2020-05-21     C    10    20    30

该数据帧可以通过以下方式生成:

dataframe = pd.DataFrame({"Time": ["2020-05-18", "2020-05-18", "2020-05-18", "2020-05-19", "2020-05-19", "2020-05-19", "2020-05-20", "2020-05-20", "2020-05-20", "2020-05-21", "2020-05-21", "2020-05-21"], "Group": ["A","B","C","A","B","C","A","B","C","A","B","C"], "Col1": 12*[10], "Col2": 12*[20], "Col3": 12*[30]})
dataframe["Time"] = pd.to_datetime(dataframe["Time"])
dataframe = dataframe.set_index("Time")

我想创建时间箱(如使用重采样函数),同一组内的平均值,然后在同一时间箱内将它们相加。但是,如果我写dataframe.resample("2D").sum(),值将直接汇总所有组,而无需首先在同一组中进行平均。像这样:

            Col1  Col2  Col3
Time
2020-05-18    60   120   180
2020-05-20    60   120   180

但我需要的是在汇总之前对属于同一组的值进行平均。在这种情况下,所需的输出将是:

            Col1  Col2  Col3
Time
2020-05-18    30   60   90
2020-05-20    30   60   90

我尝试在重新采样后应用 groupby(例如dataframe.resample("2D").grouby("Group")),但它引发了 TypeError(“'TimeGrouper' 对象不可调用”)

有什么方法可以解决这个问题?提前致谢。


编辑:

输出dataframe.groupby(["Time","Group"]).mean()

                  Col1  Col2  Col3
Time       Group
2020-05-18 A        10    20    30
           B        10    20    30
           C        10    20    30
2020-05-19 A        10    20    30
           B        10    20    30
           C        10    20    30
2020-05-20 A        10    20    30
           B        10    20    30
           C        10    20    30
2020-05-21 A        10    20    30
           B        10    20    30
           C        10    20    30

标签: pythonpandasdataframetime-seriesdatetimeindex

解决方案


Grouper与聚合一起使用mean

print (dataframe.groupby(['Group',pd.Grouper(freq='2D', key='Time')]).mean())
                  Col1  Col2  Col3
Group Time                        
A     2020-05-18    10    20    30
      2020-05-20    10    20    30
B     2020-05-18    10    20    30
      2020-05-20    10    20    30
C     2020-05-18    10    20    30
      2020-05-20    10    20    30

然后sum到第二级Time

df = (
    dataframe
    .groupby(['Group', pd.Grouper(freq='2D', key='Time')])
    .mean()
    .sum(level=1)
)

print (df)
            Col1  Col2  Col3
Time                        
2020-05-18    30    60    90
2020-05-20    30    60    90

推荐阅读