【问题标题】:Loop over dataframe, calculate correlation between columns for unique values of column?循环数据框,计算列之间的相关性以获得列的唯一值?
【发布时间】:2016-04-05 11:34:06
【问题描述】:

我有一个看起来像这样的数据框(但更长...):

    imd     code       sum
0     1    010101   1048171
1     2    010101    911003
2     3    010101    852023
3     4    010101    790893
4     5    010101    923344
5     6    010101    681473
6     7    010101    600303
7     8    010101    497439
8     9    010101    496209
9    10    010101    388457
10    1    010102  26284506
11    2    010102  23567345
12    3    010102  24933988
13    4    010102  22762737
14    5    010102  23205722
15    6    010102  21874259
16    7    010102  21604496
17    8    010102  16723338
18    9    010102  17691183
19   10    010102  15202808

现在我想计算imdsum 之间的相关性对于数据框中code 的每个唯一值。所以在这个例子中,imdsum 之间的相关性对于代码010101,然后对于代码010102 等等。

然后我想生成具有最高相关性的代码的排名列表。所以是这样的:

  code    correlation
  010102  0.44
  010101  0.38
  .... 

最好的方法是什么?我知道如何计算整个数据帧的imdsum 之间的相关性:

df[['imd','sum']].corr()

但不是如何为作为唯一代码的数据帧的每个切片重复执行此操作。

我想我可以为每个唯一的代码值创建一个新的数据框,计算imdsum 之间的相关性,然后创建一个中间数据结构来保存相关值?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    显然,我对这个问题的理解与其他人不同。 IIUC,您想要的是,根据code 值,将其他两列视为向量,并找到它们的相关系数。这将是这样的:

    import numpy as np
    
    >>> df.groupby(df.code).apply(lambda g: np.corrcoef(g.imd.values, g['sum'].values)[0][1]).sort_values()
    code
    10101   -0.955634
    10102   -0.936554
    dtype: float64
    

    【讨论】:

      【解决方案2】:

      首先您需要groupbycode 列,然后应用基于imdsum 列的关联,如下所示:

      df
      Out[6]: 
          imd   code       sum
      0     1  10101   1048171
      1     2  10101    911003
      2     3  10101    852023
      3     4  10101    790893
      4     5  10101    923344
      5     6  10101    681473
      6     7  10101    600303
      7     8  10101    497439
      8     9  10101    496209
      9    10  10101    388457
      10    1  10102  26284506
      11    2  10102  23567345
      12    3  10102  24933988
      13    4  10102  22762737
      14    5  10102  23205722
      15    6  10102  21874259
      16    7  10102  21604496
      17    8  10102  16723338
      18    9  10102  17691183
      19   10  10102  15202808
      
      df.groupby('code')[['imd','sum']].corr()
      Out[7]: 
                      imd       sum
      code                         
      10101 imd  1.000000 -0.955634
            sum -0.955634  1.000000
      10102 imd  1.000000 -0.936554
            sum -0.936554  1.000000
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-04
        • 1970-01-01
        • 2023-02-22
        • 1970-01-01
        • 2020-11-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多