python - 通过 id 列表过滤 pandas 数据框

标签 python pandas dataframe

我有一个 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 是有效的 Python 语法,因为我在如下列表中对其进行了测试:

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

过滤数据框的任何建议或替代方法?

最佳答案

你可以使用 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,那么输入必须是 bool 型NDFrame 或数组。 lambda x: x['subscriber_id'] not in subscribers 是一个函数,这就是它引发异常的原因。

这是您可以使用 df.mask 的一种方法,同样使用 isin 来形成 bool 条件:

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

关于python - 通过 id 列表过滤 pandas 数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23745677/

相关文章:

java - "cannot find the main class"使用 subprocess.Popen 调用 java 程序时出错,而同一个调用只能使用 os.system

python - 为什么 "import PIL; PIL.Image"不起作用,但 "from PIL import Image"起作用?

python - 尝试将稀疏 df 保存到 hdf5 时获取 'SparseDtype' 对象没有属性 'itemsize'?

python - 如何编写对数据帧进行多重过滤的函数?

python - 如何在保留列的同时找到累积计数行之间的差异

python - python 对预定事件进行排序

python - 每 1000 的倍数重置 Pandas Cumsum

python - 向 pandas 的每一列添加特定数量

python - 如何使用 Python 将文本添加到多个图像

python - 基于列数据计算从 Pandas DataFrame 中的另一行查找数据的最快方法?