如何基于第三列的条件合并DataFrame的两列并生成新列
Pandas按条件合并列生成新字段解决方案
原有代码错误原因
你写的循环出现问题的核心是赋值时右侧没有取对应行的值:df["column1"]是返回整列的Series对象,而非当前索引i对应的行值,导致赋值逻辑错误。另外Pandas处理这类逐行判断场景完全不需要写循环,向量化操作的执行效率远高于自定义循环,尤其适合你这种带时间序列索引的大数据量场景。
另外注意你问题描述提到是基于column3做判断,但现有代码里的判断条件是基于column1,如果实际判断逻辑和column3有关,替换下方案里的判断条件即可。
方案1:使用numpy.where(最简洁,推荐)
仅需一行代码即可完成需求:
import numpy as np # 判断逻辑:column1大于180取column1的值,否则取column2的值 df['column4'] = np.where(df['column1'] > 180, df['column1'], df['column2'])
如果需要基于column3做判断,修改第一个参数的判断逻辑即可,示例:
# 示例:column3等于指定值时取column1,否则取column2 df['column4'] = np.where(df['column3'] == '目标值', df['column1'], df['column2'])
上述方案默认column1等于180时取column2的值,你可以根据自己的需求调整判断条件。
方案2:用Pandas原生loc实现(无需额外导入包)
如果不想依赖numpy,也可以用Pandas自带的赋值方法实现:
# 先默认给column4赋值为column2的所有值 df['column4'] = df['column2'] # 把满足column1>180的行替换为column1的对应值 df.loc[df['column1'] > 180, 'column4'] = df.loc[df['column1'] > 180, 'column1']
循环写法的修正(仅作学习参考,生产环境不推荐)
如果你只是想了解循环写法的正确逻辑,可以修正为如下形式,但数据量较大时运行速度会非常慢:
for i in df.index: if df.loc[i, "column1"] > 180: df.loc[i, "column4"] = df.loc[i, "column1"] elif df.loc[i, "column1"] < 180: df.loc[i, "column4"] = df.loc[i, "column2"] # 可以自行补充column1等于180时的else处理逻辑
内容的提问来源于stack exchange,提问作者gigWindcat
相关产品推荐
相关产品推荐

