按列表中的值过滤pandas DataFrame [重复]

Posted

技术标签:

【中文标题】按列表中的值过滤pandas DataFrame [重复]【英文标题】:Filtering pandas DataFrame by values in a list [duplicate] 【发布时间】:2018-01-02 07:21:27 【问题描述】:

有一个熊猫数据框:

  df = pd.DataFrame('c1':['a','b','c','d'],'c2':[1,2,3,4])

c1  c2
0   a   1
1   b   2
2   c   3
3   d   4

还有一个熊猫系列:

list1 = pd.Series(['b','c','e','f'])

Out[6]:
0    a
1    b
2    c
3    e

如何创建一个包含 c1 在 list1 中的行的新数据框。

输出:

c1  c2
0   b   2
1   c   3 

【问题讨论】:

【参考方案1】:

你可以使用df.isin:

In [582]: df[df.c1.isin(list1)]
Out[582]: 
  c1  c2
1  b   2
2  c   3

或者,使用df.loc,如果你想修改你的切片:

In [584]: df.loc[df.c1.isin(list1), :]
Out[584]: 
  c1  c2
1  b   2
2  c   3

【讨论】:

【参考方案2】:

使用query

In [1133]: df.query('c1 in @list1')
Out[1133]:
  c1  c2
1  b   2
2  c   3

或者,使用isin

In [1134]: df[df.c1.isin(list1)]
Out[1134]:
  c1  c2
1  b   2
2  c   3

【讨论】:

【参考方案3】:

@JohnGalt 和 @COLDSPEED 的答案都更符合 pandas 的习惯。请不要使用这些答案。它们旨在有趣并说明pandasnumpy api 的其他部分。

替代 1 这是利用numpy.in1d 作为pd.Series.isin 的代理

df[np.in1d(df.c1.values, list1.values)]

  c1  c2
1  b   2
2  c   3

替代 2 使用set逻辑

df[df.c1.apply(set) & set(list1)]

  c1  c2
1  b   2
2  c   3

替代 3 使用pd.Series.str.match

df[df.c1.str.match('|'.join(list1))]

  c1  c2
1  b   2
2  c   3

【讨论】:

现在找到另一种方法变得非常具有挑战性...... ;) 在那个熊猫人来垃圾你使用numpy之前最好+1 :^) @cᴏʟᴅsᴘᴇᴇᴅ 我们很好(-:我对每个人都说得对。【参考方案4】:

为了完整起见

实现这一目标的另一种方式(绝对不是最好的方式):

In [4]: df.merge(list1.to_frame(name='c1'))
Out[4]:
  c1  c2
0  b   2
1  c   3

【讨论】:

以上是关于按列表中的值过滤pandas DataFrame [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何根据 Pandas 中的列表过滤 DataFrame 中的项目?

pandas条件组合筛选和按范围筛选

将字典嵌套在另一个字典中,按 Pandas Dataframe 中的值分组

将 Pandas DataFrame 中的列组合到 DataFrame 中的列表列

如果列中的值在一组值列表中,则过滤数据框行[重复]

在 Pandas 中使用条件列表过滤 DataFrame