Pandas:根据包含特定值

时间:2016-01-16 13:41:17

标签: python pandas dataframe

为了帮助说明我想要实现的目标是一个名为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:我编辑了这个问题,因为我第一次犯了错误。道歉。

2 个答案:

答案 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