通过ID列表过滤Pandas数据框

27 投票
2 回答
54008 浏览
提问于 2025-04-18 07:01

我有一个 pandas 数据框,里面有用户 ID 列 'subscriber_id' 和一些其他信息。

我想只选择那些不在给定列表 A 中的订阅者。

举个例子,如果我们的数据框包含的订阅者信息是 [1,2,3,4,5],而我想排除的列表是 [2,4,5],那么我最终应该得到一个只包含 [1,3] 的数据框。

我试过用一个叫做“掩码”的方法,像这样:

temp = df.mask(lambda x: x['subscriber_id'] not in subscribers)

但是没有成功!

我确定 not in 是有效的 Python 语法,因为我在一个列表上测试过,像这样:

c = [1,2,3,4,5]
if 5 not in c:
    print 'YAY'
>> YAY

有没有什么建议或者其他方法可以过滤这个数据框呢?

2 个回答

3

如果你需要这个来处理索引,可以使用类似的方式:

df[df.index.isin([11663533,12022232])]
42

你可以使用 isin 方法:

In [30]: df = pd.DataFrame({'subscriber_id':[1,2,3,4,5]})

In [31]: df
Out[31]: 
   subscriber_id
0              1
1              2
2              3
3              4
4              5

[5 rows x 1 columns]

In [32]: mask = df['subscriber_id'].isin([2,4,5])

In [33]: mask
Out[33]: 
0    False
1     True
2    False
3     True
4     True
Name: subscriber_id, dtype: bool

In [34]: df.loc[~mask]
Out[34]: 
   subscriber_id
0              1
2              3

[2 rows x 1 columns]

如果你使用 df.mask,那么输入必须是一个布尔类型的 NDFrame 或者一个数组。lambda x: x['subscriber_id'] not in subscribers 是一个函数,这就是为什么会出现异常的原因。

这里有一种使用 df.mask 的方法,再次利用 isin 来形成布尔条件:

In [43]: df['subscriber_id'].mask(df['subscriber_id'].isin([2,4,5]).values)
Out[43]: 
0     1
1   NaN
2     3
3   NaN
4   NaN
Name: subscriber_id, dtype: float64

撰写回答