如何在Pandas中添加基于两列比较结果的新列?
Pandas根据两列条件生成三值新列的解决方法
你的代码问题分析
- 索引方式错误:Pandas不能直接用
df[df[column1] > df[column2], "New Column"]这种格式定位行和列,必须用df.loc[行条件, 列名]来修改指定位置的值。 - 比较运算符错误:判断相等时用了赋值符号
=,应该用比较运算符==。 - apply语法错误:
lambda的参数不能写成df["column1"],且处理整行数据需要指定axis=1。
正确实现方法
方法1:用df.loc逐条件赋值(逻辑直观)
先给新列设默认值,再覆盖符合条件的行:
# 初始化新列为默认值C df['New Column'] = 'C' # 给column1 > column2的行赋值A df.loc[df['column1'] > df['column2'], 'New Column'] = 'A' # 给column1 < column2的行赋值B df.loc[df['column1'] < df['column2'], 'New Column'] = 'B'
方法2:用numpy.select(多场景高效)
如果后续需要扩展更多条件,用numpy.select更简洁高效:
import numpy as np # 定义条件列表和对应结果 conditions = [ df['column1'] > df['column2'], df['column1'] < df['column2'] ] results = ['A', 'B'] # 生成新列,默认值为C df['New Column'] = np.select(conditions, results, default='C')
方法3:用apply逐行处理(仅小数据量适用)
如果一定要用apply,需要按行处理,注意参数写法:
df['New Column'] = df.apply( lambda row: 'A' if row['column1'] > row['column2'] else 'B' if row['column1'] < row['column2'] else 'C', axis=1 )
⚠️ 注意:apply逐行处理效率低,数据量大时不推荐使用。
内容的提问来源于stack exchange,提问作者bmgrice
相关产品推荐
相关产品推荐

