使用 isin(list) 过滤数据帧时出现“ValueError:列必须与键长度相同”
Posted
技术标签:
【中文标题】使用 isin(list) 过滤数据帧时出现“ValueError:列必须与键长度相同”【英文标题】:"ValueError: Columns must be same length as key" when filtering dataframe with isin(list) 【发布时间】:2021-12-30 09:14:43 【问题描述】:我正在尝试根据列表中的值过滤数据框中的一列,这是我的代码的 sn-p 出错的地方(为简单起见,替换了值)
import pandas as pd
from pandas import Series
df['Campaign']=df['Location']
campaign_list = ['a', 'b']
df['Campaign']=df[df['Campaign'].isin(campaign_list)]
这是问题代码之前数据框的示例
Location Billed Amount TransactionID Campaign
a Na x a
b Na y b
c Na z c
d Na xx d
e Na xy e
f Na xz f
这是我想要的 df 的样子
Location Billed Amount TransactionID Campaign
a NaN x a
b NaN y b
c NaN z NaN
d NaN xx NaN
e NaN xy NaN
f NaN xz NaN
这是我收到的错误,这很奇怪,因为我昨天运行了这个确切的代码并且没有任何问题。这里有什么我没有看到的明显的东西吗?
~\anaconda3\lib\site-packages\pandas\core\frame.py in __setitem__(self, key, value)
3600 self._setitem_array(key, value)
3601 elif isinstance(value, DataFrame):
-> 3602 self._set_item_frame_value(key, value)
3603 elif (
3604 is_list_like(value)
~\anaconda3\lib\site-packages\pandas\core\frame.py in _set_item_frame_value(self, key, value)
3727 len_cols = 1 if is_scalar(cols) else len(cols)
3728 if len_cols != len(value.columns):
-> 3729 raise ValueError("Columns must be same length as key")
3730
3731 # align right-hand-side columns if self.columns
ValueError: Columns must be same length as key
【问题讨论】:
【参考方案1】:这应该可行:
df=df[df['Campaign'].isin(campaign_list)]
【讨论】:
抱歉,我应该指定 Location 和 Campaign 列是相同的。此语句过滤整个数据框,而不仅仅是 Campaign 列。我基本上想用 NaN 替换 Campaign 列中不在campaign_list 中的所有值。【参考方案2】:使用Series.where
df['Campaign'] = df['Campaign'].where(lambda camp: camp.isin(campaign_list))
或
df['Campaign'] = df['Campaign'].where(df['Campaign'].isin(campaign_list))
输出:
>>> df
Location Billed Amount TransactionID Campaign
0 0 Na x a
1 1 Na y b
2 2 Na z NaN
3 3 Na xx NaN
4 4 Na xy NaN
5 5 Na xz NaN
【讨论】:
完美运行。谢谢! @cdlabs45 不客气!如果答案解决了您的问题,请考虑marking it as accepted 或您喜欢的任何其他。谢谢!以上是关于使用 isin(list) 过滤数据帧时出现“ValueError:列必须与键长度相同”的主要内容,如果未能解决你的问题,请参考以下文章
当我合并两个 Pandas 数据帧时出现 MemoryError
使用 SQLAlchemy 将 pandas 数据帧导出到 MySQL 时出现操作错误 2055
为啥在使用 pyspark 加入 Spark 数据帧时出现这些 Py4JJavaError showString 错误?