pandas数据帧的分位数归一化

2024-05-10 14:19:30 发布

您现在位置:Python中文网/ 问答频道 /正文

简单地说,如何在Python中对大熊猫数据帧(可能有2000000行)应用分位数规范化?

注意:我知道有一个名为rpy2的包可以在子进程中运行R,在R中使用分位数normalize。但事实上,当我使用下面的数据集时,R无法计算正确的结果:

5.690386092696389541e-05,2.051450375415418849e-05,1.963190184049079707e-05,1.258362869906251862e-04,1.503352476021528139e-04,6.881341586355676286e-06
8.535579139044583634e-05,5.128625938538547123e-06,1.635991820040899643e-05,6.291814349531259308e-05,3.006704952043056075e-05,6.881341586355676286e-06
5.690386092696389541e-05,2.051450375415418849e-05,1.963190184049079707e-05,1.258362869906251862e-04,1.503352476021528139e-04,6.881341586355676286e-06
2.845193046348194770e-05,1.538587781561563968e-05,2.944785276073619561e-05,4.194542899687506431e-05,6.013409904086112150e-05,1.032201237953351358e-05

编辑:

我想要的:

给定上面显示的数据,如何按照https://en.wikipedia.org/wiki/Quantile_normalization中的步骤应用分位数规范化。

我在Python中找到一段代码,声明它可以计算分位数标准化:

import rpy2.robjects as robjects
import numpy as np
from rpy2.robjects.packages import importr
preprocessCore = importr('preprocessCore')


matrix = [ [1,2,3,4,5], [1,3,5,7,9], [2,4,6,8,10] ]
v = robjects.FloatVector([ element for col in matrix for element in col ])
m = robjects.r['matrix'](v, ncol = len(matrix), byrow=False)
Rnormalized_matrix = preprocessCore.normalize_quantiles(m)
normalized_matrix = np.array( Rnormalized_matrix)

代码可以很好地处理代码中使用的示例数据,但是当我使用上面给出的数据进行测试时,结果出错了。

由于ryp2提供了在python子进程中运行R的接口,所以我直接在R中再次测试它,结果仍然是错误的。因此我认为原因是R中的方法是错误的。


Tags: 数据代码import进程asnpelement规范化
3条回答

好吧,我自己实现了这个方法,效率比较高。

完成后,这个逻辑看起来有点简单,但无论如何,我决定把它贴在这里,因为任何人都会感到困惑,就像我无法在谷歌上搜索可用的代码一样。

代码在github中:Quantile Normalize

值得注意的一点是,ayhan和shawn的代码都对ties使用较小的秩平均值,但是如果您使用R包processcore的normalize.quantiles(),它将对ties使用秩平均值。

使用上述示例:

> df

   C1  C2  C3
A   5   4   3
B   2   1   4
C   3   4   6
D   4   2   8

> normalize.quantiles(as.matrix(df))

         C1        C2        C3
A  5.666667  5.166667  2.000000
B  2.000000  2.000000  3.000000
C  3.000000  5.166667  4.666667
D  4.666667  3.000000  5.666667

使用来自Wikipedia article的示例数据集:

df = pd.DataFrame({'C1': {'A': 5, 'B': 2, 'C': 3, 'D': 4},
                   'C2': {'A': 4, 'B': 1, 'C': 4, 'D': 2},
                   'C3': {'A': 3, 'B': 4, 'C': 6, 'D': 8}})

df
Out: 
   C1  C2  C3
A   5   4   3
B   2   1   4
C   3   4   6
D   4   2   8

对于每个秩,平均值可通过以下公式计算:

rank_mean = df.stack().groupby(df.rank(method='first').stack().astype(int)).mean()

rank_mean
Out: 
1    2.000000
2    3.000000
3    4.666667
4    5.666667
dtype: float64

然后,生成的序列rank_mean可以用作列组的映射,以获得规范化结果:

df.rank(method='min').stack().astype(int).map(rank_mean).unstack()
Out: 
         C1        C2        C3
A  5.666667  4.666667  2.000000
B  2.000000  2.000000  3.000000
C  3.000000  4.666667  4.666667
D  4.666667  3.000000  5.666667

相关问题 更多 >