我想提取关联最小的列。 Excel示例如下:
数据被读入列表。
可以在您的机器上复制和粘贴。
data = [[1.0, 0.753392, 3.0, 0.725201], [2.0, 0.041109837, 6.0, 0.062877178], [3.0, 0.423832988, 9.0, 0.866027735], [4.0, 0.434915355, 12.0, 0.192467473], [5.0, 0.654428813, 15.0, 0.108341448], [6.0, 0.324773769, 18.0, 0.844229809], [7.0, 0.967524725, 21.0, 0.934810338], [8.0, 0.793547241, 24.0, 0.990572248], [9.0, 0.741736506, 27.0, 0.74011758], [10.0, 0.187684226, 30.0, 0.41631089], [11.0, 0.206195617, 33.0, 0.819677047], [12.0, 0.025064815, 36.0, 0.688291108], [13.0, 0.534330027, 39.0, 0.032694883], [14.0, 0.018739144, 42.0, 0.354950289], [15.0, 0.091988505, 45.0, 0.491944161], [16.0, 0.030296596, 48.0, 0.269117609], [17.0, 0.498798595, 51.0, 0.524733097], [18.0, 0.099476344, 54.0, 0.845788803], [19.0, 0.070866294, 57.0, 0.997247157], [20.0, 0.464518871, 60.0, 0.172750938], [21.0, 0.733827466, 63.0, 0.822552104], [22.0, 0.354165581, 66.0, 0.214911818]]
df = pd.DataFrame(data)
print df
0 1 2 3
0 2.0 0.041110 6.0 0.062877
1 3.0 0.423833 9.0 0.866028
2 4.0 0.434915 12.0 0.192467
3 5.0 0.654429 15.0 0.108341
4 6.0 0.324774 18.0 0.844230
5 7.0 0.967525 21.0 0.934810
6 8.0 0.793547 24.0 0.990572
7 9.0 0.741737 27.0 0.740118
8 10.0 0.187684 30.0 0.416311
9 11.0 0.206196 33.0 0.819677
10 12.0 0.025065 36.0 0.688291
11 13.0 0.534330 39.0 0.032695
12 14.0 0.018739 42.0 0.354950
13 15.0 0.091989 45.0 0.491944
14 16.0 0.030297 48.0 0.269118
15 17.0 0.498799 51.0 0.524733
16 18.0 0.099476 54.0 0.845789
17 19.0 0.070866 57.0 0.997247
18 20.0 0.464519 60.0 0.172751
19 21.0 0.733827 63.0 0.822552
20 22.0 0.354166 66.0 0.214912
r2 = df.corr()**2
print r2
0 1 2 3
0 1.000000 0.033327 1.000000 0.000218
1 0.033327 1.000000 0.033327 0.037813
2 1.000000 0.033327 1.000000 0.000218
3 0.000218 0.037813 0.000218 1.000000
result = np.argwhere(np.triu(np.abs(r2.values) <= 0.047))
print result
[[0 3]
[2 3]]
但是,[0,1,3]不是预期的结果。
欢迎任何解决此类问题的最佳实践。
编辑: 预期结果,相关数据最少的3列(A,B和D)
1 0.753391901 0.725201405
2 0.041109837 0.062877178
3 0.423832988 0.866027735
4 0.434915355 0.192467473
5 0.654428813 0.108341448
6 0.324773769 0.844229809
7 0.967524725 0.934810338
8 0.793547241 0.990572248
9 0.741736506 0.74011758
10 0.187684226 0.41631089
11 0.206195617 0.819677047
12 0.025064815 0.688291108
13 0.534330027 0.032694883
14 0.018739144 0.354950289
15 0.091988505 0.491944161
16 0.030296596 0.269117609
17 0.498798595 0.524733097
18 0.099476344 0.845788803
19 0.070866294 0.997247157
20 0.464518871 0.172750938
21 0.733827466 0.822552104
22 0.354165581 0.214911818
答案 0 :(得分:1)
由于您有多对,所以我认为这是最好的方法:
rs = r2.stack()
rs_min = rs[rs <= rs.min() + 1e-4] # I added some tolerance here
cols = rs_min.index.values
有了您的数据,这给了我
>>> rs_min.index.values
array([(0, 3), (2, 3), (3, 0), (3, 2)], dtype=object)
如果要平整的唯一值列表,可以转换数组:
vals = list(set(item[1] for item in vals))
(您可以使用item[0]
或item[1]
,因为两对都是对称的)
给出
>>> list(set(item[1] for item in vals))
[0, 2, 3]
根据您的表,请注意Excel和Pandas确实给出了相关的不同结果。该代码假定熊猫给出了正确的结果。
编辑:
如果您想恢复原始结果数据,则可以
print(data[:, vals])
那应该给你你的结果。