如何从Pandas数据框中删除包含特定字符串的特定列的行?

177

我有一个非常大的Python数据框,我想删除在特定列中包含特定字符串的所有行。

例如,我想要删除在数据框的列C中作为子字符串出现的所有行。

是否可以使用.drop()方法以高效的方式实现此目标?

7个回答

303

pandas拥有向量化的字符串操作,因此您可以仅过滤包含不需要的字符串的行:

In [91]: df = pd.DataFrame(dict(A=[5,3,5,6], C=["foo","bar","fooXYZbar", "bat"]))

In [92]: df
Out[92]:
   A          C
0  5        foo
1  3        bar
2  5  fooXYZbar
3  6        bat

In [93]: df[~df.C.str.contains("XYZ")]
Out[93]:
   A    C
0  5  foo
1  3  bar
3  6  bat

43
虽然你所写的是正确且更易读的,但更简短的方法是:df[~df.C.str.contains("XYZ")] - EdChum
1
当我这样做时,它完美地工作,但它也不显示任何值为NaN的行。有没有办法让它们回来,以便生成的数据框包含不包含所需字符串和NaN的行? - bchards
2
如果你想查找的不是"XYZ",而是在一个包含1000个不同元素的大列表中查找,你会怎么做? - 0004
5
我遇到一个错误:TypeError: bad operand type for unary ~: 'float',对于这个问题你有什么想法吗? - ah bon
3
通过添加 na=False 解决的问题。 - ah bon
显示剩余4条评论

152
如果您的字符串约束不仅仅是一个字符串,您可以使用以下方法删除相应的行:
df = df[~df['your column'].isin(['list of strings'])]

以上代码将删除包含列表元素的所有行。


1
你会如何做这个的反向操作?我想检查列值是否包含任何一个字符串。伪代码:对于字符串列表中的每个字符串,检查列是否包含它 - radtek
7
去掉“~” df = df[df['你的列名'].isin(['字符串列表'])] - Kenan
3
如果我们不知道这一列是哪一列呢? - Piyush S. Wanare
2
如何删除多列而不仅是一列? - Ali P
2
这对我有用,但我意识到“字符串列表”应该是您要删除的确切字符串。 - eafloresf
显示剩余5条评论

54

如果您想比较精确字符串,那么这将起作用。如果您想检查列字符串是否包含列表中的任何字符串,则不起作用。

与列表进行比较的正确方法是:

searchfor = ['john', 'doe']
df = df[~df.col.str.contains('|'.join(searchfor))]

28
代码稍作修改。使用 na=False 可以跳过空值,否则你可能会遇到错误 TypeError: bad operand type for unary ~: float
df[~df.C.str.contains("XYZ", na=False)]

来源: TypeError: bad operand type for unary ~: float



10
以下代码将为您提供所有行的列表:
df[df['C'] != 'XYZ']

为将上述代码中的值存储到数据框中:

newdf = df[df['C'] != 'XYZ']

1
这个语法更容易记忆。谢谢。 - Saurabh Bade

3
如果您不想删除所有的NaN,请使用以下方法:
df[~df.C.str.contains("XYZ") == True]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接