如何基于外部数值对DataFrame中员工数按接近度排名?
问题描述
我有一个包含公司名称和员工数量的DataFrame,结构如下:
| 公司名称 | 员工数量 |
|---|---|
| Company A | 1478 |
| Company B | 12 |
| Company C | 490 |
| Company D | 34012 |
需要根据用户输入的一个数值(比如10),按照各公司员工数与该数值的差值绝对值大小分配排名:差值越小排名越靠前;若两家公司员工数相同,需分配相同排名。
以输入值10为例,预期结果如下:
| 公司名称 | 员工数量 | 排名 |
|---|---|---|
| Company A | 1478 | 3 |
| Company B | 12 | 1 |
| Company C | 490 | 2 |
| Company D | 34012 | 4 |
我了解df.rank()函数,但不清楚如何基于和目标数值的差值实现该排名功能。
解决方案
你可以通过以下两步实现需求:
- 计算员工数与目标值的差值绝对值,量化"接近程度"
- 基于该差值绝对值,用
df.rank()完成排名,配置参数处理并列情况
示例代码
假设目标输入值为target = 10,具体实现代码如下:
import pandas as pd # 构建原始DataFrame data = { "公司名称": ["Company A", "Company B", "Company C", "Company D"], "员工数量": [1478, 12, 490, 34012] } df = pd.DataFrame(data) target = 10 # 计算员工数与目标值的差值绝对值 df["差值绝对值"] = abs(df["员工数量"] - target) # 基于差值绝对值排名:ascending=True表示差值越小排名越靠前;method='min'确保相同差值的行获得相同排名 df["排名"] = df["差值绝对值"].rank(method='min', ascending=True) # 可选:删除临时的差值列 df = df.drop("差值绝对值", axis=1) print(df)
参数说明
ascending=True:差值越小越接近目标值,因此用升序排名,让小差值对应小排名数method='min':当多个行的差值绝对值相同时,会为它们分配相同的最小排名(比如两个公司差值均为5,都会排第1),满足"相同员工数分配相同排名"的要求
运行代码后即可得到符合预期的结果。
内容的提问来源于stack exchange,提问作者blindschleiche
相关产品推荐
相关产品推荐

