每行“排名” DataFrame列

时间:2019-04-10 07:20:07

标签: python pandas numpy

给定一个时间序列DataFrame,是否可以创建一个具有相同尺寸的新DataFrame,但值是与其他列相比的每一行的排名(排在最前面的最小值)?

示例:

                 ABC      DEFG      HIJK       XYZ
date                                              
2018-01-14  0.110541  0.007615  0.063217  0.002543
2018-01-21  0.007012  0.042854  0.061271  0.007988
2018-01-28  0.085946  0.177466  0.046432  0.069297
2018-02-04  0.018278  0.065254  0.038972  0.027278
2018-02-11  0.071785  0.033603  0.075826  0.073270

第一行将变为:

            ABC  DEFG  HIJK  XYZ
date                            
2018-01-14    4     2     3    1

XYZ在该行中的值最小,而ABC在该行中的值最大。

numpy.argsort看起来像可能帮助,但是由于它会输出位置本身,因此我无法使其正常工作。

非常感谢

1 个答案:

答案 0 :(得分:3)

对每行rank使用双argsort,并传递给DataFrame构造函数:

df1 = pd.DataFrame(df.values.argsort().argsort() + 1, index=df.index, columns=df.columns)
print (df1)
            ABC  DEFG  HIJK  XYZ
date                            
2018-01-14    4     2     3    1
2018-01-21    1     3     4    2
2018-01-28    3     4     1    2
2018-02-04    1     4     3    2
2018-02-11    2     1     4    3

或将DataFrame.rank与method ='dense'一起使用:

df1 = df.rank(axis=1, method='dense').astype(int)
print (df1)
            ABC  DEFG  HIJK  XYZ
date                            
2018-01-14    4     2     3    1
2018-01-21    1     3     4    2
2018-01-28    3     4     1    2
2018-02-04    1     4     3    2
2018-02-11    2     1     4    3