我在要素之间具有df
的相关性。
CRIM ZN INDUS CHAS NOX RM AGE
CRIM 1.000000 -0.199458 0.404471 -0.055295 0.417521 -0.219940 0.350784
ZN -0.199458 1.000000 -0.533828 -0.042697 -0.516604 0.311991 -0.569537
INDUS 0.404471 -0.533828 1.000000 0.062938 0.763651 -0.391676 0.644779
CHAS -0.055295 -0.042697 0.062938 1.000000 0.091203 0.091251 0.086518
NOX 0.417521 -0.516604 0.763651 0.091203 1.000000 -0.302188 0.731470
RM -0.219940 0.311991 -0.391676 0.091251 -0.302188 1.000000 -0.240265
AGE 0.350784 -0.569537 0.644779 0.086518 0.731470 -0.240265 1.000000
DIS -0.377904 0.664408 -0.708027 -0.099176 -0.769230 0.205246 -0.747881
我想要的是一个corr()
字典,其中两个要素之间的值是gt(0.5) and ne(1)
也是负数corr()
lt(0.5)
我尝试过
df.corr()[(df.corr().gt(0.5)) & (df.corr().ne(1))].stack().round(3).to_dict()
这给了我特征corr()
和gt(0.5)
之间的所有正面ne(1)
,但我还需要字典中强烈否定的corr()
le(0.5)
?
还有什么方法可以获取唯一值?
结果是我需要唯一的值。 ZN - NOX
和NOX - ZN
应该被视为一个。我俩都该听了吗?
答案 0 :(得分:2)
df.corr()[((df.corr().gt(0.5)) & (df.corr().ne(1))) | ((df.corr().lt(-0.5)) & (df.corr().ne(-1)))].stack().round(3).to_dict()
编辑(更加有效和可读):
df_corr = df.corr()
high_positive_corr = (df_corr.gt(0.5)) & (df_corr.ne(1))
low_negative_corr = (df_corr.lt(-0.5)) & (df_corr.ne(-1))
df_corr[high_positive_corr | low_negative_corr].stack().round(3).to_dict()
所以您不会计算5次相关性
答案 1 :(得分:1)
使用m1
正值和m2
负值掩码,然后将stack
和drop_duplicates
用作:
m1 = (df.corr().gt(0.5)) & (df.corr().ne(1))
m2 = (df.corr().lt(-0.5)) & (df.corr().ne(-1))
df.corr()[m1|m2].stack().drop_duplicates().round(3).to_dict()
OR
d = df.corr()
m = ((d>0.5)&(d!=1))|((d<-0.5)&(d!=-1))
d[m].stack().drop_duplicates().round(3).to_dict()
两者都产生输出:
{('CRIM', 'ZN'): -0.199,
('CRIM', 'INDUS'): 0.404,
('CRIM', 'NOX'): 0.418,
('CRIM', 'RM'): -0.22,
('CRIM', 'AGE'): 0.351,
('ZN', 'INDUS'): -0.534,
('ZN', 'NOX'): -0.517,
('ZN', 'RM'): 0.312,
('ZN', 'AGE'): -0.57,
('INDUS', 'NOX'): 0.764,
('INDUS', 'RM'): -0.392,
('INDUS', 'AGE'): 0.645,
('NOX', 'RM'): -0.302,
('NOX', 'AGE'): 0.731,
('RM', 'AGE'): -0.24}
答案 2 :(得分:1)
根据需要创建遮罩。这将更具可读性。
此外,作为性能提示,您可以将corr存储在变量中,从而避免重复计算
mask_1 = (df.corr().gt(0.5)) & (df.corr().ne(1))
mask_2 = (df.corr().lt(-0.5)) & (df.corr().ne(-1))
mask = mask_1 | mask_2
df.corr()[mask].stack().round(3).to_dict()