如何提取关联最小的列?

时间:2018-07-13 07:05:56

标签: python pandas numpy scipy

我想提取关联最小的列。 Excel示例如下:

enter image description here

数据被读入列表。
可以在您的机器上复制和粘贴。

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

1 个答案:

答案 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])

那应该给你你的结果。