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

使用isin()过滤DataFrame列时触发ValueError: Columns must be same length as key错误的排查求助

解决Pandas赋值时的"Columns must be same length as key"错误

嘿,我来帮你搞清楚这个问题!咱们先拆解下你遇到的报错原因,再给出符合你预期的解决方案。

问题根源

你代码里的关键错误出在这一行:

df['Campaign']=df[df['Campaign'].isin(campaign_list)]

当你执行df[df['Campaign'].isin(campaign_list)]时,返回的是整个过滤后的DataFrame(只包含Location为a、b的2行完整数据),而你试图把这个多列的DataFrame赋值给df['Campaign']这单列——相当于用2行的数据集去覆盖原DataFrame里6行的列,长度完全不匹配,所以Pandas抛出了ValueError。

至于昨天运行没问题,大概率是你昨天的代码细节有差异(比如不小心写成了df['Campaign'].isin(campaign_list)而非整个DataFrame过滤),不过咱们重点解决当前的需求~

符合你预期的实现方案

你想要的是保留所有行,仅把Campaign列中不在campaign_list里的值替换为NaN,这里有两种简洁的实现方式:

方法1:使用where方法

where会保留符合条件的值,把不符合的替换为NaN,完美匹配你的需求:

import pandas as pd

# 构造示例DataFrame(模拟你的初始数据)
data = {
    'Location': ['a', 'b', 'c', 'd', 'e', 'f'],
    'Billed Amount': [pd.NA]*6,
    'TransactionID': ['x', 'y', 'z', 'xx', 'xy', 'xz'],
    'Campaign': ['a', 'b', 'c', 'd', 'e', 'f']
}
df = pd.DataFrame(data)

campaign_list = ['a', 'b']
# 保留符合条件的Campaign值,其余设为NaN
df['Campaign'] = df['Campaign'].where(df['Campaign'].isin(campaign_list))

方法2:使用loc条件赋值

这种写法更直观,直接定位不符合条件的行并赋值NaN:

# 定位Campaign不在列表中的行,将对应列设为NaN
df.loc[~df['Campaign'].isin(campaign_list), 'Campaign'] = pd.NA

验证结果

执行完上述任意一种代码后,你的DataFrame会完全符合预期:

LocationBilled AmountTransactionIDCampaign
axa
byb
cz
dxx
exy
fxz

补充:如果是想过滤行而非修改列值

如果你的需求是删除不符合条件的行(而非保留行替换值),那正确的写法应该是直接重新赋值整个DataFrame:

df = df[df['Campaign'].isin(campaign_list)]

但这会得到只有前2行的结果,和你当前的预期不符,所以还是前面两种方法更适合你。

内容的提问来源于stack exchange,提问作者cdlabs45

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.01 02:17:45