Python Pandas:基于包含特定值的字符串高效地子集数据帧

Python Pandas:基于包含特定值的字符串高效地子集数据帧,python,pandas,dataframe,Python,Pandas,Dataframe,为了帮助说明我想在这里实现的是一个名为df的数据帧: 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 我想对数据帧进行子集划分—条件是,如果column2中的字符串

为了帮助说明我想在这里实现的是一个名为
df
的数据帧:

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
我想对数据帧进行子集划分—条件是,如果
column2
中的字符串包含多个值中的一个,则删除行

对于单个值来说,这非常简单,在本例中为“foo”:

df=df[~df['column2'].str.contains(“foo”)]

但假设我想删除第2列中字符串包含“cat”或“foo”的所有行。应用于上面的
df
,这将减少5行

做这件事的最有效、最有吸引力的方法是什么?这可以是一个函数的形式,多个布尔值,或者我没有想到的其他形式

isin
不起作用,因为它需要精确匹配


N.B:我已经编辑了这个问题,因为我在第一轮中犯了一个错误。抱歉。

您可以使用逻辑掩蔽:

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

您可以将逻辑掩蔽用作:

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
用于测试值列表的成员资格,并对布尔掩码求反
~

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
用于测试值列表的成员资格,并对布尔掩码求反
~

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

我在最初的问题上犯了一个错误。您答对了,但直到最近我才意识到
isin
需要精确匹配。我对问题进行了编辑,以反映我需要能够选择包含特定值而不是精确匹配的字符串。我认为这几乎肯定需要以某种方式使用
str.contains()
。抱歉。当人们发布的问题没有详细说明他们想要什么时,这真的很烦人。在这种情况下,Fabio的答案就是你想要的,将来你需要陈述你的确切要求,发布代表性数据和期望的输出。将问题改为“这是我真正想要的”是令人难以置信的恼人和浪费人们的时间,在某些情况下,发布另一个问题可能会更好。很抱歉,我惹恼了你,浪费了你的时间。Ed.吸取的教训。我在最初的问题上犯了一个错误。您答对了,但直到最近我才意识到
isin
需要精确匹配。我对问题进行了编辑,以反映我需要能够选择包含特定值而不是精确匹配的字符串。我认为这几乎肯定需要以某种方式使用
str.contains()
。抱歉。当人们发布的问题没有详细说明他们想要什么时,这真的很烦人。在这种情况下,Fabio的答案就是你想要的,将来你需要陈述你的确切要求,发布代表性数据和期望的输出。改变这个问题是我真正想要的是令人难以置信的恼人和浪费人的时间,在某些情况下,最好是张贴另一个问题。我很抱歉我惹恼了你,浪费了你的时间。教训。下一次考虑张贴一个新问题,由于@EdChum answer很好地解决了原始问题,因此我从您和@EdChum身上学到了一些宝贵的经验。我不会再犯同样的错误了。谢谢。下一次考虑发表一个新的问题,因为原来的问题被EdjUm回答好了。我从这个问题中得到了一些宝贵的教训。我不会再犯同样的错误了。谢谢