【问题标题】:"Rank" DataFrame columns per row每行“排名”DataFrame 列
【发布时间】:2019-04-10 07:20:07
【问题描述】:

给定一个时间序列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 看起来它可能有帮助,但是因为它会输出位置本身,我没有设法让它工作。

非常感谢

【问题讨论】:

    标签: python pandas numpy


    【解决方案1】:

    对每行 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 with 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
    

    【讨论】:

    • df.rank() 看起来是满足此要求的更自然的解决方案。赞成 +1
    猜你喜欢
    • 2019-08-20
    • 1970-01-01
    • 1970-01-01
    • 2021-11-21
    • 2021-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-19
    相关资源
    最近更新 更多