Pandas如何基于DataFrame两列组合值为数据匹配规则打标签
简洁实现方案
首先注意你原始DataFrame的Math 、Art 列名末尾带多余空格,直接按无空格列名选取会触发KeyError,第一步先清理列名,再做后续计算,整体代码比逐行apply的写法效率更高、逻辑更清晰。
完整可运行代码
import pandas as pd # 原始数据集 df = pd.DataFrame({ 'Student ID': [123456,789456,101112,131415], 'Math ': [3,2,4,2], 'Art ': [3,3,3,1] }) # 1. 清理列名首尾多余空格 df.columns = df.columns.str.strip() # 2. 生成combined列:用数值计算代替字符串拼接,效率更高 df['combined'] = df['Math'] * 10 + df['Art'] # 3. 定义分数组合与标签的映射关系,直接覆盖正反分数组合 score_label_map = { 11: "Unsatisfactory", 12: "Unsatisfactory", 21: "Unsatisfactory", 22: "Moderate", 23: "Moderate", 32: "Moderate", 33: "Good", 34: "Good", 43: "Good", 45: "Excellent", 54: "Excellent", 55: "Excellent" } # 4. 映射生成最终标签列 df['label'] = df['combined'].map(score_label_map)
实现说明
- 生成
combined列时没有用逐行apply做字符串拼接,而是直接用数学计算:Math为十位、Art为个位,Math*10 + Art直接得到整数结果,是pandas原生向量运算,数据量越大速度优势越明显,也省掉了转字符串、再转整数的冗余步骤。 - 标签匹配用字典映射实现,后续要新增分数组合、修改对应标签,直接编辑
score_label_map字典即可,不需要改动核心逻辑代码。 - 运行后得到的结果完全匹配你的预期:
| Student ID | Math | Art | combined | label |
|---|---|---|---|---|
| 123456 | 3 | 3 | 33 | Good |
| 789456 | 2 | 3 | 23 | Moderate |
| 101112 | 4 | 3 | 43 | Good |
| 131415 | 2 | 1 | 21 | Unsatisfactory |
如果存在不在映射表里的分数组合,对应label会显示为空值,你可以按需在字典里补充对应的规则即可。
内容的提问来源于stack exchange,提问作者Mona
相关产品推荐
相关产品推荐

