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

如何在Pandas中一次性完成符合条件行的多列批量更新?

Pandas 一次性更新满足条件的多列值

我有一个如下结构的Pandas DataFrame:

RowSourceLocationCampaignNew Campaignsome other columns
1s1l1c1nc1...
2s2l2c2nc2...
3s3l3c3nc3...

存在一个基于some other columns中规则组合而成的布尔条件crit。需要实现:
当某行满足条件crit时:

  • 将Source、Location分别替换为常量x和y。
  • 将Campaign替换为New Campaign列对应的值。

例如,若第1行和第3行满足条件,期望输出如下:

RowSourceLocationCampaignNew Campaignsome other columns
1xync1nc1...
2s2l2c2nc2...
3xync3nc3...

当前通过两步操作实现:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 19:13:16