【问题标题】:Pandas Correlation Between List of Columns X Whole Dataframe列列表 X 整个数据框之间的 Pandas 相关性
【发布时间】:2018-01-11 05:34:07
【问题描述】:

我正在寻找有关 Pandas .corr() 方法的帮助。

照原样,我可以使用 .corr() 方法计算每个可能的列组合的热图:

corr = data.corr()
sns.heatmap(corr)

在我的 23,000 列数据框中,这可能会在宇宙热寂附近终止。

我还可以在值的子集之间进行更合理的相关性

data2 = data[list_of_column_names]
corr = data2.corr(method="pearson")
sns.heatmap(corr)

这给了我一些我可以使用的东西——下面是一个例子:

我想做的是将 20 列的列表与整个数据集进行比较。正常的 .corr() 函数可以给我一个 20x20 或 23,000x23,000 的热图,但基本上我想要一个 20x23,000 的热图。

如何为我的相关性添加更多特异性?

感谢您的帮助!

【问题讨论】:

    标签: python pandas data-visualization data-science


    【解决方案1】:

    经过昨晚的工作,我得到了以下答案:

    #datatable imported earlier as 'data'
    #Create a new dictionary
    plotDict = {}
    # Loop across each of the two lists that contain the items you want to compare
    for gene1 in list_1:
        for gene2 in list_2:
            # Do a pearsonR comparison between the two items you want to compare
            tempDict = {(gene1, gene2): scipy.stats.pearsonr(data[gene1],data[gene2])}
            # Update the dictionary each time you do a comparison
            plotDict.update(tempDict)
    # Unstack the dictionary into a DataFrame
    dfOutput = pd.Series(plotDict).unstack()
    # Optional: Take just the pearsonR value out of the output tuple
    dfOutputPearson = dfOutput.apply(lambda x: x.apply(lambda x:x[0]))
    # Optional: generate a heatmap
    sns.heatmap(dfOutputPearson)
    

    与其他答案非常相似,这会生成一个热图(见下文),但它可以缩放以允许 20,000x30 矩阵,而无需计算整个 20,000x20,000 组合之间的相关性(因此终止速度更快)。

    【讨论】:

      【解决方案2】:

      列出您想要的子集(在本例中为 A、B 和 C),创建一个空数据框,然后使用嵌套循环用所需的值填充它。

      df = pd.DataFrame(np.random.randn(50, 7), columns=list('ABCDEFG'))
      
      # initiate empty dataframe
      corr = pd.DataFrame()
      for a in list('ABC'):
          for b in list(df.columns.values):
              corr.loc[a, b] = df.corr().loc[a, b]
      
      corr
      Out[137]: 
                A         B         C         D         E         F         G
      A  1.000000  0.183584 -0.175979 -0.087252 -0.060680 -0.209692 -0.294573
      B  0.183584  1.000000  0.119418  0.254775 -0.131564 -0.226491 -0.202978
      C -0.175979  0.119418  1.000000  0.146807 -0.045952 -0.037082 -0.204993
      
      sns.heatmap(corr)
      

      【讨论】:

      • 感谢您的有用评论!这似乎在理论上运作良好。在实践中,看起来 corr = data.corr().iloc[3:5,1:2] 应该是一个相对简单的关联,需要相当长的时间才能终止(到目前为止大约 5 分钟后才终止)。我猜这是因为 .corr() 首先计算我所有 23,000 行之间的相关性,然后进行切片。
      • 如果新的更改解决了您的问题,请接受此答案。
      • 非常感谢您的帮助,Andrew——不幸的是,新的答案仍然存在同样的问题:无论何时调用df.corr(),无论后续切片如何,pandas 基本上都不会终止。我昨晚做了这个,我的解决方案最终使用 scipy.stats.pearsonR 调用将项目放入字典。我稍后会发布该答案。
      • 太糟糕了。如果您发现可行的方法,您应该发布答案。
      【解决方案3】:

      通常对所有变量成对计算相关系数是最有意义的。 pd.corr() 是成对(以及所有对)计算相关系数的便捷函数。 您也可以使用 scipy 仅针对循环中的指定对来执行此操作。

      例子:

      d=pd.DataFrame([[1,5,8],[2,5,4],[7,3,1]], columns=['A','B','C'])
      

      熊猫中的一对可能是:

      d.corr().loc['A','B']
      

      -0.98782916114726194

      scipy 中的等价物:

      import scipy.stats
      scipy.stats.pearsonr(d['A'].values,d['B'].values)[0]
      

      -0.98782916114726194

      【讨论】:

        猜你喜欢
        • 2019-10-15
        • 2020-01-16
        • 2018-07-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-04
        • 2019-03-09
        • 1970-01-01
        • 2018-04-14
        相关资源
        最近更新 更多