基于多列条件在Pandas数据框中生成新列的技术咨询
基于多列条件在Pandas数据框中生成新列的技术咨询
我来帮你梳理一下这个Pandas数据处理的问题哈~首先先把你的需求和现有代码里的小问题理清楚,再给出生成目标列E的可行方案。
你的场景还原
你现在有一个Pandas数据框,初始数据结构是这样的:
import pandas as pd rankings = {'Vol A % ': [266.2, 266.6, 258.81, 232.84], 'Vol B %': [233.8, 233.4, 241.19, 267.16], 'Effo A % ': [235.61, 251.48 , 264.99, 232.59 ], 'Effo B % ': [264.39, 248.52, 235.01,267.41]} df = pd.DataFrame(rankings)
你想要先生成Vol和Eff两列,规则是:
Vol列:当Vol A %大于Vol B %时取值"A",否则取值"B"Eff列:当Effo A %大于Effo B %时取值"A",否则取值"B"
之后还要基于这些列的结果,生成新列E。不过你之前写的代码里列名和实际数据框的列名不匹配(比如写了Vol pos %,但实际是Vol A %),这里先帮你修正这部分。
第一步:正确生成Vol和Eff列
这里有两种高效的实现方式,你可以根据数据集大小选择:
方式1:用numpy.where(推荐,大数据集更高效)
numpy.where是向量化操作,比逐行处理快很多,代码如下:
import numpy as np # 生成Vol列 df['Vol'] = np.where(df['Vol A % '] > df['Vol B %'], 'A', 'B') # 生成Eff列 df['Eff'] = np.where(df['Effo A % '] > df['Effo B % '], 'A', 'B')
方式2:用apply(小数据集更直观)
如果数据集不大,用apply逐行判断也很清晰:
df['Vol'] = df.apply(lambda row: 'A' if row['Vol A % '] > row['Vol B %'] else 'B', axis=1) df['Eff'] = df.apply(lambda row: 'A' if row['Effo A % '] > row['Effo B % '] else 'B', axis=1)
运行后你的数据框会变成这样:
| Vol A % | Vol B % | Effo A % | Effo B % | Vol | Eff | |
|---|---|---|---|---|---|---|
| 0 | 266.2 | 233.8 | 235.61 | 264.39 | A | B |
| 1 | 266.6 | 233.4 | 251.48 | 248.52 | A | A |
| 2 | 258.81 | 241.19 | 264.99 | 235.01 | A | A |
| 3 | 232.84 | 267.16 | 232.59 | 267.41 | B | B |
第二步:生成目标列E
假设你需要基于Vol和Eff的组合逻辑生成E,这里举几个常见的场景示例,你可以根据实际需求调整:
场景1:多条件分支判断
如果E的规则是:
- 当
Vol和Eff都是"A"时,E为"优秀" - 当
Vol是"A"但Eff是"B"时,E为"有待优化" - 当
Vol是"B"但Eff是"A"时,E为"潜力股" - 当两者都是"B"时,
E为"需改进"
可以用np.select实现,代码如下:
# 定义条件列表和对应的结果列表 conditions = [ (df['Vol'] == 'A') & (df['Eff'] == 'A'), (df['Vol'] == 'A') & (df['Eff'] == 'B'), (df['Vol'] == 'B') & (df['Eff'] == 'A'), (df['Vol'] == 'B') & (df['Eff'] == 'B') ] results = ['优秀', '有待优化', '潜力股', '需改进'] df['E'] = np.select(conditions, results, default='未知')
运行后E列的结果:
| E | |
|---|---|
| 0 | 有待优化 |
| 1 | 优秀 |
| 2 | 优秀 |
| 3 | 需改进 |
场景2:简单匹配判断
如果规则是Vol和Eff取值相同时E为"匹配",否则为"不匹配",直接用np.where就行:
df['E'] = np.where(df['Vol'] == df['Eff'], '匹配', '不匹配')
小提示
你数据框的列名里有多余的首尾空格(比如Vol A % ),很容易在写代码时出错,建议先统一清理列名:
df.columns = df.columns.str.strip()
清理后列名会变成Vol A %、Vol B %,后续写代码就不用再纠结空格的问题啦~
备注:内容来源于stack exchange,提问作者rakesh
相关产品推荐
相关产品推荐

