Pandas DataFrame按条件将D、E列值同步赋值到A、B列的方案咨询
Pandas 多列批量赋值问题解决方案
原代码错误原因
- 自定义函数返回值不符合要求:仅返回了列名嵌套列表,没有取当前行对应列的实际值,且未处理C列值不等于
cc的场景,会返回None导致赋值失败 - 多列选择语法错误:
df[['A'],['B']]不是合法的多列索引写法,正确写法为df[['A','B']]
可行方案1:自定义函数+apply实现
import pandas as pd def func(row): if row['C'] == 'cc': # 符合条件返回D、E列的当前行值,替换A、B return pd.Series([row['D'], row['E']]) else: # 不符合条件返回原A、B值,不修改 return pd.Series([row['A'], row['B']]) df[['A', 'B']] = df.apply(func, axis=1)
可行方案2:向量化操作(性能更优,推荐大数据量使用)
无需自定义函数,直接通过布尔掩码批量赋值,效率远高于逐行apply:
# 生成C列值为cc的行掩码 mask = df['C'] == 'cc' # 批量替换对应行的A、B列值 df.loc[mask, 'A'] = df.loc[mask, 'D'] df.loc[mask, 'B'] = df.loc[mask, 'E']
效果验证
构造测试数据运行:
df = pd.DataFrame({ 'A': ['aa', 'aa', 'aa'], 'B': ['bb', 'bb', 'bb'], 'C': ['cc', None, 'cc'], 'D': ['dd1', 'dd2', 'dd3'], 'E': ['ee1', 'ee2', 'ee3'] }) # 执行上述赋值代码后输出 print(df)
输出结果:
A B C D E 0 dd1 ee1 cc dd1 ee1 1 aa bb None dd2 ee2 2 dd3 ee3 cc dd3 ee3
完全符合需求。
内容的提问来源于stack exchange,提问作者Lalitha balasubramaniam
相关产品推荐
相关产品推荐

