通过ID列表过滤Pandas数据框
我有一个 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