我有一个Pandas数据帧,数据如下。我需要按company
和date
分组,然后通过这样的分组计算滚动平均值(例如2天、3天等(。
df = pd.DataFrame({
'company': ['abc', 'abc', 'abc', 'xyz', 'xyz', 'xyz'],
'dt': pd.to_datetime([
'2022-01-01', '2022-01-02', '2022-01-03',
'2022-01-31', '2022-02-01', '2022-02-02'
]),
'volume': [1, 2, 3, 4, 5, 6]
})
如果我执行以下操作,则滚动平均数是跨公司的。
df.groupby(['company', 'dt'])['volume'].mean().rolling(2).mean()
结果如下,但不是我想要的。当我到达xyz
公司时,它应该只考虑与该公司相关的日期/值。
公司dtabc 2022-01-01 NaN2022-01-02 1.52022-01-03 2.5xyz 2022-01-31 3.52022-02-01 4.52022-02-02 5.5
此外,我不能指定频率为2D
或3D
;如果我这样做,那么我会得到以下错误:ValueError: window must be an integer 0 or greater
。
唯一的方法是发布单独的代码吗?
df[df['company']=='abc'].groupby(['dt'])['volume'].mean().rolling('2D').mean()
df[df['company']=='xyz'].groupby(['dt'])['volume'].mean().rolling('2D').mean()
有更好的方法。在company
上分组,并使用dt
作为计算rolling
窗口的列:
df['dt'] = pd.to_datetime(df['dt'])
df.groupby('company').rolling('2d', on='dt')['volume'].mean()
company dt
abc 2022-01-01 1.0
2022-01-02 1.5
2022-01-03 2.5
xyz 2022-01-31 4.0
2022-02-01 4.5
2022-02-02 5.5
Name: volume, dtype: float64