需要帮助根据输入值分配排名/变量,以及该排名在百分位数列的哪个位置。 例子:
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]
(如果有更好的表示方法可以更改)
我已经尝试使用sort values(同时使用apply函数),但无法解决最小值和最大值条件。这个pandas df有100k+的行。
提前致谢。
code levels = { "df['0.00'] == df[value]": 7, "(df['0.00'] < df[value]) & (df['0.68'] >= df[value])": 5, "(df['0.68'] < df[value]) & (df['0.99'] >= 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)
- Sharif