我有一个看起来像这样的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
Run Code Online (Sandbox Code Playgroud)
作为数据框架,它看起来像这样:
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
Run Code Online (Sandbox Code Playgroud)
我想要做的是执行从最后一列(Pearson相关special_col)与之间的每个列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
Run Code Online (Sandbox Code Playgroud)
上述值是手动计算的:
In [27]: import scipy.stats
In [39]: scipy.stats.pearsonr([3, 1, 3], [11,505,5])
Out[39]: (-0.9999453506011533, 0.0066556395400007278)
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
Phl*_*lya 14
注意你的数据有一个错误,特殊的col都是3,所以不能计算相关性.
如果最后删除列选择,您将获得正在分析的所有其他列的相关矩阵.最后一个[:-1]是删除'special_col'与自身的相关性.
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
Run Code Online (Sandbox Code Playgroud)
如果您对速度感兴趣,我的机器上的速度会略快一些:
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
Run Code Online (Sandbox Code Playgroud)
但显然,它返回一个数组,而不是一个熊猫系列/ DF.
你可以apply在你的列范围内lambda调用corr并传递Series 'special_col':
In [126]:
df[df.columns[1:-1]].apply(lambda x: x.corr(df['special_col']))
Out[126]:
stem1 0.500000
stem2 -0.500000
stem3 -0.999945
b1 0.500000
b2 0.500000
b3 -0.500000
dtype: float64
Run Code Online (Sandbox Code Playgroud)
计时
实际上另一种方法更快,所以我希望它能更好地扩展:
In [130]:
%timeit df[df.columns[1:-1]].apply(lambda x: x.corr(df['special_col']))
%timeit df[df.columns[1:]].corr()['special_col']
1000 loops, best of 3: 1.75 ms per loop
1000 loops, best of 3: 836 µs per loop
Run Code Online (Sandbox Code Playgroud)
pd.DataFrame.corrwith()可被用来代替df.corr() 。
传入我们希望与其余列相关联的预期列。
对于上面的具体示例,代码将是: df.corrwith(df['special_col'])
或者简单地df.corr()['special_col']来创建每列与其他列的完整相关性和子集你需要的。
为什么不这样做:
In [34]: df.corr().iloc[:-1,-1]
Out[34]:
stem1 0.500000
stem2 -0.500000
stem3 -0.999945
b1 0.500000
b2 0.500000
b3 -0.500000
Name: special_col, dtype: float64
Run Code Online (Sandbox Code Playgroud)
要么:
In [39]: df.corr().ix['special_col', :-1]
Out[39]:
stem1 0.500000
stem2 -0.500000
stem3 -0.999945
b1 0.500000
b2 0.500000
b3 -0.500000
Name: special_col, dtype: float64
Run Code Online (Sandbox Code Playgroud)
计时
In [35]: %timeit df.corr().iloc[-1,:-1]
1000 loops, best of 3: 576 us per loop
In [40]: %timeit df.corr().ix['special_col', :-1]
1000 loops, best of 3: 634 us per loop
In [36]: %timeit df[df.columns[1:]].corr()['special_col']
1000 loops, best of 3: 968 us per loop
In [37]: %timeit df[df.columns[1:-1]].apply(lambda x: x.corr(df['special_col']))
100 loops, best of 3: 2.12 ms per loop
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
36743 次 |
| 最近记录: |