为了帮助说明我想要实现的目标是一个名为df
的DataFrame:
column1 column2
1 foo faa
2 bar car
3 dog dog
4 cat rat
5 foo foo
6 bar cat
7 bird rat
8 cat dog
9 bird foo
10 bar car
我想要对DataFrame进行子集化 - 条件是如果column2
中的字符串包含多个值中的一个,则会删除行。
对于单个值来说这很容易,在这种情况下,' foo':
df = df[~df['column2'].str.contains("foo")]
但是,让我们说我想删除第2列中的字符串所包含的所有行' cat'或者' foo'。如上所述适用于df
,这将减少5行。
最有效,最pythonic的方法是什么?这可以是函数的形式,多个布尔值或者我没想到的其他东西。
isin
无法正常工作,因为它需要完全匹配。
N.B:我编辑了这个问题,因为我第一次犯了错误。道歉。
答案 0 :(得分:3)
您可以使用逻辑掩码:
df = df[(~df['column2'].str.contains("foo")) & (~df['column2'].str.contains("bird")) & (~df['column2'].str.contains("cat"))]
返回:
column1 column2
1 2 bar
2 3 dog
5 6 bar
9 10 bar
答案 1 :(得分:3)
使用isin
测试值列表的成员资格并否定~
布尔掩码:
In [3]:
vals = ['bird','cat','foo']
df[~df['column2'].isin(vals)]
Out[3]:
column1 column2
1 2 bar
2 3 dog
5 6 bar
9 10 bar
In [4]:
df['column2'].isin(vals)
Out[4]:
0 True
1 False
2 False
3 True
4 True
5 False
6 True
7 True
8 True
9 False
Name: column2, dtype: bool