使用 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:列必须与键长度相同”的主要内容,如果未能解决你的问题,请参考以下文章

使用 pyspark 将数据帧写入 Kafka 时出现异常

绘制数据帧时出现内存错误(matplotlib)

对数据帧火花执行操作时出现空指针异常

当我合并两个 Pandas 数据帧时出现 MemoryError

使用 SQLAlchemy 将 pandas 数据帧导出到 MySQL 时出现操作错误 2055

为啥在使用 pyspark 加入 Spark 数据帧时出现这些 Py4JJavaError showString 错误?