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

how to calculate correlation between rows in python pandas data frame

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

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)

但我得到的是很多 Nan 的

首先,请注意最后两个相关性是 1 和 -1,而不是您预期的 0.5 和 -0.5。

解决方案

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

结果

0    1.0
1    1.0
2   -1.0
dtype: float64

我认为你试图得到的数字实际上不是相关系数。第一行和第二行之间的相关性是 1 而不是 0.5。相关性是变量之间线性关系的量度。这里的两个列表与皮尔逊系数 1 密切相关。如果您将 row0 [2,6,8,12] 与 row1 [1,3,4,6] 作图,它们都位于一条线上。同时,如果您想找到行之间的相关性,这应该可行:

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

pd.DataFrame(dfb.transpose()).corr()

这是一个使用 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