【问题标题】:how to calculate correlation between rows in python pandas data frame如何计算python pandas数据框中行之间的相关性
【发布时间】:2017-11-02 12:07:01
【问题描述】:

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

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)

但我会得到很多南的

【问题讨论】:

标签: python performance pandas linear-regression correlation


【解决方案1】:

首先,请注意最后 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

【讨论】:

  • 不用for循环,可以dataframe.corrwith(series)。即:dfb.corrwith(dfa.iloc[0], axis=1)
  • 去掉第二个解决方案,第一个是最好的
  • 当然,您对相关数字的看法是正确的。我最初的任务是找到线性回归的斜率,但这需要的时间太长,所以我正在寻找更快的解决方案。
【解决方案2】:

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

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

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

【讨论】:

  • 谢谢它的工作。但我只需要一行与所有其他行之间的相关性。您的解决方案会计算所有行对相关性。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-19
    • 1970-01-01
    • 1970-01-01
    • 2020-05-30
    • 1970-01-01
    • 2021-01-14
    • 2021-07-04
    • 1970-01-01
    相关资源
    最近更新 更多