Pandas:结合重采样和分组依据。在将它们汇总到时间仓中之前,如何对同一组内的值求平均值?

Pandas: combine resampling and group by. How do I average values within same groups before summing them up in a time bin?

我有与时间戳和自定义组关联的表格数据(由 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")),但它引发了类型错误(“'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

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