如何在Pandas中一次性完成符合条件行的多列批量更新?
Pandas 一次性更新满足条件的多列值
我有一个如下结构的Pandas DataFrame:
| Row | Source | Location | Campaign | New Campaign | some other columns |
|---|---|---|---|---|---|
| 1 | s1 | l1 | c1 | nc1 | ... |
| 2 | s2 | l2 | c2 | nc2 | ... |
| 3 | s3 | l3 | c3 | nc3 | ... |
存在一个基于some other columns中规则组合而成的布尔条件crit。需要实现:
当某行满足条件crit时:
- 将
Source、Location分别替换为常量x和y。 - 将
Campaign替换为New Campaign列对应的值。
例如,若第1行和第3行满足条件,期望输出如下:
| Row | Source | Location | Campaign | New Campaign | some other columns |
|---|---|---|---|---|---|
| 1 | x | y | nc1 | nc1 | ... |
| 2 | s2 | l2 | c2 | nc2 | ... |
| 3 | x | y | nc3 | nc3 | ... |
当前通过两步操作实现:
df.loc[crit, ['Source', 'Location']] = ['x', 'y'] df.loc[crit, 'Campaign'] = df.loc[crit, 'New Campaign']
想知道是否可以一次性完成该操作,尝试以下代码时出现报错:
df.loc[crit, ['Source', 'Location', 'Campaign']] = ['x', 'y', df.loc[crit, 'New Campaign']]
解决方案
可以通过两种方式一次性完成赋值,核心是保证右侧赋值内容与左侧选中的行列结构匹配:
方法1:字典映射赋值
直接用字典明确指定每列对应的赋值内容,Pandas会自动匹配列名完成赋值:
df.loc[crit, ['Source', 'Location', 'Campaign']] = { 'Source': 'x', 'Location': 'y', 'Campaign': df.loc[crit, 'New Campaign'] }
方法2:构造临时DataFrame赋值
创建一个与筛选结果行数、列名完全匹配的临时DataFrame,再整体赋值:
import pandas as pd temp_df = pd.DataFrame({ 'Source': 'x', 'Location': 'y', 'Campaign': df.loc[crit, 'New Campaign'].values }, index=df[crit].index) df.loc[crit, ['Source', 'Location', 'Campaign']] = temp_df
原代码报错原因
原代码中['x', 'y', df.loc[crit, 'New Campaign']]是混合了标量和Series的列表,Pandas无法将这种非对齐的结构直接映射到目标列,必须保证右侧内容的形状或列名与左侧选中区域匹配。
内容的提问来源于stack exchange,提问作者lpounng
相关产品推荐
相关产品推荐

