使用 isin(列表) 过滤数据框时"ValueError: Columns must be same length as key"



我正试图根据列表中的值过滤数据帧中的一列,这是我的代码片段中出现错误的地方(为了简单起见,替换了值(

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

这是我收到的错误,这很奇怪,因为我昨天运行了这个确切的代码,没有任何问题。这里有什么明显的我没有看到的东西吗?

~anaconda3libsite-packagespandascoreframe.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)
~anaconda3libsite-packagespandascoreframe.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

使用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

这应该有效:

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

相关内容

最新更新