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
我有与时间戳和自定义组关联的表格数据(由 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