我有一个数据帧:
df=pd.dataframe({'group':['A','A','A','A','A','A','A','A','B','B','B','B','B','B','B','B'],'val1':[100,200,300,400,50,150,250,350,50,150,250,350,100,200,300,475],'val2':[3,5,10,-3,2,-5,89,12,35,5,10,-3,2,-5,89,12]})
我想计算列val1'&'之间的相关系数val2’,滚动窗口为3并且在每组内。我想把它作为一列添加到数据帧中。我可以在不使用groupby:的情况下做到这一点
df['val1'].rolling(5).corr(df['val2'])
但我无法将其与groupby相结合。
我正在寻找的输出是一个添加到原始df中的列,如下所示:
组 | Val1 | Val2 | 相关性|
---|---|---|---|
A | 100 | 3 | 楠 |
A | 200 | 5 | 南|
A | 300 | 10 | 南|
A | 400 | -3 | 南|
A | 50 | 2 | 0.1 |
A | 150 | -5 | -0.25 |
A | 250 | >89 | 0.8 |
A | 350 | 120.65 | [/tr>|
B | 50 | 35 | 楠 |
B | 150 | 5楠 | |
B | 250 | 10 | 楠 |
B | 350 | -3楠 | //tr>|
B | 100 | 2 | -0.43[/tr>|
B | 200 | -5 | 0.23[/tr>|
B | 475 | 89 | 0.87 |
B | 100 | <12>0.65[/tr>
您可以使用.groupby()
按列group
进行分组。结果将是两个组,每个组包含所有行(即使是不属于该组的行(。然后,通过与原始行索引上的.GroupBy.max()
进行聚合,进一步组合不同组的结果,如下所示:
df['Correlation'] = df.groupby('group')['val1'].rolling(5).corr(df['val2']).groupby(level=1).max()
结果:
print(df)
group val1 val2 Correlation
0 A 100 3 NaN
1 A 200 5 NaN
2 A 300 10 NaN
3 A 400 -3 NaN
4 A 50 2 -0.136808
5 A 150 -5 0.051931
6 A 250 89 0.093510
7 A 350 12 0.079207
8 B 50 35 NaN
9 B 150 5 NaN
10 B 250 10 NaN
11 B 350 -3 NaN
12 B 100 2 -0.652637
13 B 200 -5 -0.210248
14 B 300 89 0.328695
15 B 475 12 0.152914