如何计算python pandas数据帧中行之间的相关性

时间:2017-11-02 12:07:01

标签: python performance pandas linear-regression correlation

我有大数据帧,我需要有效地计算数据帧行和给定值列表之间的相关性。例如:

dfa= DataFrame(np.zeros((1,4)) ,columns=['a','b','c','d'])
dfa.ix[0] = [2,6,8,12]
a   b   c   d
2.0 6.0 8.0 12.0
dfb= DataFrame([[2,6,8,12],[1,3,4,6],[-1,-3,-4,-6]], columns=['a','b','c','d'])
    a   b   c   d
0   2   6   8   12
1   1   3   4   6
2  -1  -3  -4  -6

我希望得到:

0    1
1    0.5
2   -0.5

我尝试了很多版本,例如:

dfb.T.corrwith(dfa.T, axis=0)

但我得到的是很多南非的

3 个答案:

答案 0 :(得分:3)

我认为你想要获得的数字实际上不是相关系数。第1行和第2行之间的相关性为1而不是0.5。相关性是变量之间线性关系的度量。这里两个列表与皮尔逊系数1密切相关。如果你绘制row0 [2,6,8,12]对行1 [1,3,4,6]它们都在一条线上。如果你想在行之间找到相关性,那么这应该是有效的:

注意:正确的相关性是[1,1,-1]

pd.DataFrame(dfb.transpose())。科尔()

答案 1 :(得分:2)

首先,请注意最后2个相关因素是1和-1而不是0.5和-0.5,正如您所料。

<强>解决方案

dfb.corrwith(dfa.iloc[0], axis=1)

<强>结果

0    1.0
1    1.0
2   -1.0
dtype: float64

答案 2 :(得分:2)

这是一个使用NumPy工具的相关性定义,用于corr2_coeff_rowwise的性能 -

pd.Series(corr2_coeff_rowwise(dfa.values,dfb.values))

示例运行 -

In [74]: dfa
Out[74]: 
     a    b    c     d
0  2.0  6.0  8.0  12.0

In [75]: dfb
Out[75]: 
   a  b  c   d
0  2  6  8  12
1  1  3  4   6
2 -1 -3 -4  -6

In [76]: pd.Series(corr2_coeff_rowwise(dfa.values,dfb.values))
Out[76]: 
0    1.0
1    1.0
2   -1.0
dtype: float64

运行时测试

案例#1:dfb4列中的大量行 -

In [77]: dfa = pd.DataFrame(np.random.randint(1,100,(1,4)))

In [78]: dfb = pd.DataFrame(np.random.randint(1,100,(30000,4)))

# @sera's soln
In [79]: %timeit dfb.corrwith(dfa.iloc[0], axis=1)
1 loop, best of 3: 4.09 s per loop

In [80]: %timeit pd.Series(corr2_coeff_rowwise(dfa.values,dfb.values))
1000 loops, best of 3: 1.53 ms per loop

案例#2:dfb400列中的行数下降 -

In [83]: dfa = pd.DataFrame(np.random.randint(1,100,(1,400)))

In [85]: dfb = pd.DataFrame(np.random.randint(1,100,(300,400)))

In [86]: %timeit dfb.corrwith(dfa.iloc[0], axis=1)
10 loops, best of 3: 44.8 ms per loop

In [87]: %timeit pd.Series(corr2_coeff_rowwise(dfa.values,dfb.values))
1000 loops, best of 3: 635 µs per loop