我有一个这样的csv:

gene,stem1,stem2,stem3,b1,b2,b3,special_col
foo,20,10,11,23,22,79,3
bar,17,13,505,12,13,88,1
qui,17,13,5,12,13,88,3

作为数据框架,它看起来是这样的:
In [17]: import pandas as pd
In [20]: df = pd.read_table("http://dpaste.com/3PQV3FA.txt",sep=",")
In [21]: df
Out[21]:
  gene  stem1  stem2  stem3  b1  b2  b3  special_col
0  foo     20     10     11  23  22  79            3
1  bar     17     13    505  12  13  88            1
2  qui     17     13      5  12  13  88            3

我要做的是从最后一列(special_col)执行Pearson相关,在gene列和special column之间的每一列,即colnames[1:number_of_column-1]
在一天结束时,我们将有长度为6的数据帧。
Coln   PearCorr
stem1  0.5
stem2 -0.5
stem3 -0.9999453506011533
b1    0.5
b2    0.5
b3    -0.5

上面的值是手动计算的:
In [27]: import scipy.stats
In [39]: scipy.stats.pearsonr([3, 1, 3], [11,505,5])
Out[39]: (-0.9999453506011533, 0.0066556395400007278)

我该怎么做?

最佳答案

注意,您的数据中有一个错误,特殊的列都是3,因此无法计算相关性。
如果在最后删除列选择,您将得到正在分析的所有其他列的相关矩阵。最后一个[:-1]是删除“特殊列”与自身的相关性。

In [15]: data[data.columns[1:]].corr()['special_col'][:-1]
Out[15]:
stem1    0.500000
stem2   -0.500000
stem3   -0.999945
b1       0.500000
b2       0.500000
b3      -0.500000
Name: special_col, dtype: float64

如果您对速度感兴趣,我的机器会稍微快一点:
In [33]: np.corrcoef(data[data.columns[1:]].T)[-1][:-1]
Out[33]:
array([ 0.5       , -0.5       , -0.99994535,  0.5       ,  0.5       ,
       -0.5       ])

In [34]: %timeit np.corrcoef(data[data.columns[1:]].T)[-1][:-1]
1000 loops, best of 3: 437 µs per loop

In [35]: %timeit data[data.columns[1:]].corr()['special_col']
1000 loops, best of 3: 526 µs per loop

但显然,它返回的是一个数组,而不是熊猫系列/df。

07-24 09:52
查看更多