用一个id列表过滤pandas数据框

26

我有一个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个回答

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

2
如果您需要用于索引,请使用类似的方法:
df[df.index.isin([11663533,12022232])]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接