组的关联和加入DataFrame

时间:2018-08-14 07:26:29

标签: python pandas group-by correlation

import pandas as pd
d = {'Val1': ['A','A','A','B','B','B','C','C','C','D','D','D'], 'Val2': 
[5,4,6,4,8,7,4,5,2,1,1,9] , 'Val3': [4, 5,6,1,2,9,8,5,1,5,9,5]}
df = pd.DataFrame(data=d)
df

输出

Val1 Val2 Val3 Val4+++
0   A   5   4
1   A   4   5
2   A   6   6
3   B   4   1
4   B   8   2
5   B   7   9
6   C   4   8
7   C   5   5
8   C   2   1
9   D   1   5
10  D   1   9
11  D   9   5

可以使用此代码计算两列的相关性,但是我不确定这是最好/最快的方法。

 vers1=df.groupby('Val1')[['Val2','Val3']].corr().iloc[0::2][['Val3']]
 vers2=df.groupby('Val1')[['Val2','Val3']].corr().iloc[0::2]['Val3']

A    Val2  0.500000
B    Val2  0.385727
C    Val2  0.714575
D    Val2 -0.500000

我无法将数据连接到原始数据,因此它们看起来像这样。

  Val1 Val2 Val3 Val4+++
0   A   5   4  0.500000
1   A   4   5  0.500000
2   A   6   6  0.500000
3   B   4   1  0.385727
4   B   8   2  0.385727
5   B   7   9  0.385727
6   C   4   8  0.714575
7   C   5   5  0.714575
8   C   2   1  0.714575
9   D   1   5 -0.500000
10  D   1   9 -0.500000
11  D   9   5 -0.500000

如果我能够将它们与原始联系在一起,我愿意采用其他方法来计算相关性或关联性度量。

2 个答案:

答案 0 :(得分:0)

我希望您正在寻找: 在merge函数上进行一些微调会有所帮助。

import pandas as pd
d = {'Val1': ['A','A','A','B','B','B','C','C','C','D','D','D'], 'Val2': [5,4,6,4,8,7,4,5,2,1,1,9] , 'Val3': [4, 5,6,1,2,9,8,5,1,5,9,5]}
df = pd.DataFrame(data=d)
df

corr=df.groupby('Val1')[['Val2','Val3']].corr().groupby('Val1').min()[['Val3']]
corr
Out[42]: 
          Val3
Val1          
A     0.500000
B     0.385727
C     0.714575
D    -0.500000

out=pd.merge(df,corr,on='Val1',how='inner')
out
out
Out[43]: 
   Val1  Val2  Val3_x    Val3_y
0     A     5       4  0.500000
1     A     4       5  0.500000
2     A     6       6  0.500000
3     B     4       1  0.385727
4     B     8       2  0.385727
5     B     7       9  0.385727
6     C     4       8  0.714575
7     C     5       5  0.714575
8     C     2       1  0.714575
9     D     1       5 -0.500000
10    D     1       9 -0.500000
11    D     9       5 -0.500000

答案 1 :(得分:0)

您可以通过对系列进行相关来缩短相关代码:

df.groupby("Val1")["Val2"].corr(df["Val3"])