我有一个数据集如下:
import pandas as pd
data = {'Category': ['A','A','A','A','A','A','B','B','B','B','B','C','C','C','C','C'],
'Date' : [1,2,3,4,5,6,1,2,3,4,5,1,2,3,4,5],
'Count': [1,2,3,4,5,1,2,3,4,5,6,1,2,3,4,6]}
df = pd.DataFrame(data)
我试图计算每3行的平均计数,不包括按类别分组的当前行,日期从新的到旧的,如果没有足够的3行计算,它将返回0。
预期结果如下所示。例如:对于日期1的A类,平均值计算为A类日期2、3和4的平均值。
<表类>类别 日期 数 平均 tbody><<tr>1 1 3 2 2 4 3 3 3.333333333 4 4 2.666666666 5 5 0 6 1 0 B1 2 4 B2 3 5 B3 4 0 B4 5 0 B5 6 0 C1 1 3 C2 2 4.333333333 C3 3 0 C4 4 0 C5 6 0 表类>
您可以将rolling
与shift
和sort_values
组合使用,如下所示:
def reverse_roll(df):
df['Count'] = df.sort_values('Date', ascending=False)['Count'].rolling(3, 3).mean().shift()
df['Count'] = df['Count'].fillna(0.0)
df = df.sort_values('Date', ascending=True)
return df
df.groupby('Category').apply(reverse_roll)
上面,rolling(3, 3)
用于强制滚动窗口总是考虑3行而不是更少。因此,前2行结果将是NaN,它通过fillna
设置为0。若要在窗口中不包括当前行,则使用shift
。
结果:
Category Date Count
0 A 1 3.000000
1 A 2 4.000000
2 A 3 3.333333
3 A 4 0.000000
4 A 5 0.000000
5 A 6 0.000000
6 B 1 4.000000
7 B 2 5.000000
8 B 3 0.000000
9 B 4 0.000000
10 B 5 0.000000
11 C 1 3.000000
12 C 2 4.333333
13 C 3 0.000000
14 C 4 0.000000
15 C 5 0.000000