更优雅地计算 Pandas 中列差异的 z 分数

More elegant computation of zscore of column differences in Pandas

我有一个 n x m DataFrame,用于量化 m 区域中 n 基因的表达。我想计算所有区域对之间差异表达的基因数量。

               Area                             Area
 Gene    A     B     C            Area    A    B    C             
  a                                 A 
  b                      -->        B     x
  c                                 C

在上面的草图中,x 表示区域 AB 共有的基因数量,这些基因在区域 B 中富集。 我需要计算所有成对列差异的 zscore。

当前方法

def compare(one,two):
     column_one_header,column_one_data = one
     column_two_header,column_two_data = two
     zscores =  zscore(column_one_data-column_two_data)
     return len(zscores[zscores>threshold])


 heatmap = [[compare(column_one,column_two)
             for column_one in df.iteritems()]
             for column_two in df.iteritems()]

This question 表明有一种更简单、更快速的方法可以做到这一点。与那个问题相反,我想做多个操作。我不确定如何为我的问题编写类似的单行代码。

df = pd.DataFrame(random_integers(0,100,(3,3)),columns=list('ABC'),index=list('abc'))


differ = reshape([sum(df[col2]-df[col]) for col2 in df for col in df], (3,3))
differ = pd.DataFrame(differ, columns=list('ABC'),index=list('ABC'))

differ

您仍然可以在调用 sum(a-b) 的地方使用您自己的函数。请注意,我们让 Pandas 处理按顺序应用函数,这通常更优雅。