我有一个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
过滤数据框的任何建议或替代方法?
答案 0 :(得分:15)
您可以使用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
答案 1 :(得分:0)
如果您需要索引,请使用类似的方法:
df[df.index.isin([11663533,12022232])]