You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于多列条件在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 %VolEff
0266.2233.8235.61264.39AB
1266.6233.4251.48248.52AA
2258.81241.19264.99235.01AA
3232.84267.16232.59267.41BB

第二步:生成目标列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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.16 12:44:50