我有一个这样的数据框
data = [["ID1", 1, 5], ["ID1", 2, 6], ["ID1", 3, 7],
["ID1", 4, 4], ["ID1", 5, 2], ["ID1", 6, 2],
["ID2", 1, 4], ["ID2", 2, 6], ["ID2", 3, 1],
["ID2", 4, 1], ["ID2", 5, 4]]
data = pd.DataFrame(data = data, columns=["ID", "colA", "colB"])
data
ID colA colB
0 ID1 1 5
1 ID1 2 6
2 ID1 3 7
3 ID1 4 4
4 ID1 5 2
5 ID1 6 2
6 ID2 1 4
7 ID2 2 6
8 ID2 3 1
9 ID2 4 1
10 ID2 5 4
我想计算每个组中最后3个项目的平均值和相关性。
但是我的数据集非常大(> 10Mn)
一般而言,我正在尝试这种方式,但是它适用于小数据,而对实际数据却很扼制
data['Avg_last3'] = data.groupby(['ID'])['colB'].apply(lambda x: x.rolling(min_periods = 1, window = 3).mean())
相关性在colA
和colB
之间。平均值仅适用于colB
我最终的预期输出是
ID colA colB Corr_last3 Avg_last3
0 ID1 1 5 0 5
1 ID1 2 6 1 5.5
2 ID1 3 7 1 6
3 ID1 4 4 -0.65 5.66
4 ID1 5 2 -0.99 4.33
5 ID1 6 2 -0.86 2.66
6 ID2 1 4 0 4
7 ID2 2 6 1 5
8 ID2 3 1 -0.59 3.66
9 ID2 4 1 -0.86 2.66
10 ID2 5 4 0.86 2
答案 0 :(得分:1)
尝试:
data['Avg_last3'] = data.groupby(['ID'])['colB'].rolling(min_periods = 1, window = 3).mean().reset_index(drop=True)
data['Corr_last3'] = data.groupby(['ID'])['colB', 'colA'].rolling(min_periods = 1, window = 3).corr().iloc[0::2, -1].reset_index(drop=True)
输出:
ID colA colB Avg_last3 Corr_last3
0 ID1 1 5 5.000000 NaN
1 ID1 2 6 5.500000 1.000000
2 ID1 3 7 6.000000 1.000000
3 ID1 4 4 5.666667 -0.654654
4 ID1 5 2 4.333333 -0.993399
5 ID1 6 2 2.666667 -0.866025
6 ID2 1 4 4.000000 NaN
7 ID2 2 6 5.000000 1.000000
8 ID2 3 1 3.666667 -0.596040
9 ID2 4 1 2.666667 -0.866025
10 ID2 5 4 2.000000 0.866025