我有大数据帧,我需要有效地计算数据帧行和给定值列表之间的相关性。例如:
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)
但我得到的是很多南非的
答案 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:dfb
和4
列中的大量行 -
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:dfb
和400
列中的行数下降 -
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