【问题标题】:Pandas - rank the input value based on column valuesPandas - 根据列值对输入值进行排名
【发布时间】:2021-01-05 13:07:34
【问题描述】:

在根据输入值分配排名/变量时需要帮助,以及百分位数的列值在哪里 示例:

If input value = Min column value --> Rank 1
input value between Min column value and P25 column value --> Rank 2
input value between P75 column value and Max column value --> Rank 5
input value = Max column value --> Rank 6

这里是示例数据:

    date | value | Min  | P25  | P50  | P75  | Max       | output
    ---------------------------------------------------
    1-Sep| 45    | 12.0 | 28.2 | 48.9 | 85.4 | 98.0      | 3
    2-Sep| 63    | 12.0 | 28.2 | 48.9 | 85.4 | 98.0      | 4
    3-Sep| 87    | 12.0 | 28.2 | 48.9 | 85.4 | 98.0      | 5
    4-Sep| 12    | 12.0 | 28.1 | 48.9 | 85.2 | 98.0      | 1
    5-Sep| 89    | 14.2 | 28.8 | 48.9 | 85.8 | 98.0      | 5
    6-Sep| 98    | 14.2 | 28.8 | 48.9 | 85.8 | 98.0      | 6
    7-Sep| 41    | 14.2 | 28.8 | 48.9 | 85.6 | 97.9      | 3
    8-Sep| 22    | 14.2 | 28.8 | 48.9 | 85.6 | 97.9      | 2

排名字典(配置)是这样的:[Min:1, P25:2, P50:3, p75:4, Max:5, Max:6](如果有更好的表示方式可以改这个)

我尝试使用排序值(在使用应用功能时),但无法确定最小/最大条件。这个 pandas df 有 100k+ 行。

提前致谢。

【问题讨论】:

    标签: python pandas percentile argmax


    【解决方案1】:

    您可以使用np.select 来执行此操作:

    cond1 = df['value'] <= df['Min']
    cond2 = df['value'] <= df['P25']
    cond3 = df['value'] <= df['P50']
    cond4 = df['value'] <= df['P75']
    cond5 = df['value'] < df['Max']
    
    df['rank'] = np.select([cond1, cond2, cond3, cond4, cond5], [1,2,3,4,5], 6)
    
    df
    

    输出:

            date  value   Min   P25   P50   P75   Max  output  rank
    1      1-Sep   45.0  12.0  28.2  48.9  85.4  98.0     3.0     3
    2      2-Sep   63.0  12.0  28.2  48.9  85.4  98.0     4.0     4
    3      3-Sep   87.0  12.0  28.2  48.9  85.4  98.0     5.0     5
    4      4-Sep   12.0  12.0  28.1  48.9  85.2  98.0     1.0     1
    5      5-Sep   89.0  14.2  28.8  48.9  85.8  98.0     5.0     5
    6      6-Sep   98.0  14.2  28.8  48.9  85.8  98.0     6.0     6
    7      7-Sep   41.0  14.2  28.8  48.9  85.6  97.9     3.0     3
    8      8-Sep   22.0  14.2  28.8  48.9  85.6  97.9     2.0     2
    

    【讨论】:

    • 感谢斯科特波士顿。工作得很好。我在字典中添加了条件和选择,使用 pd.eval 和 np.select
    • @Sharif 我想看看你的解决方案,你介意发布它吗?我总是从 Stack Overflow 学习东西。
    • 这是我的代码的 sn-p:code levels = { "df['0.00'] == df[value]": 7, "(df['0.00'] &lt; df[value]) &amp; (df['0.68'] &gt;= df[value])": 5, "(df['0.68'] &lt; df[value]) &amp; (df['0.99'] &gt;= df[value])": 3, "df['1.00'] == df[value]": 1, } condlist = [] choicelist = [] for key, value in levels.items(): condlist.append(pd.eval(key)) choicelist.append(value) df[target_col] = np.select(condlist, choicelist)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-05
    • 2015-09-24
    • 1970-01-01
    • 1970-01-01
    • 2020-05-19
    • 2017-09-14
    相关资源
    最近更新 更多