按列表中的值过滤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
的习惯。请不要使用这些答案。它们旨在有趣并说明pandas
和numpy
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 Dataframe 中的值分组