根据条件从pandas DataFrame中删除行

7

我是pandas的新手,请原谅我的问题!

以下是我的代码:

import pandas as pd

pet_names = ["Name","Species"
"Jack","Cat"
"Jill","Dog"
"Tom","Cat"
"Harry","Dog"
"Hannah","Dog"]

df = pd.DataFrame(pet_names)

df = df[df['Species']!='Cat']

print(df)

我想删除所有包含“Cat”在“Species”列中的行,只留下所有的狗。我该怎么做?不幸的是,这段代码目前返回错误。

1
可能是基于列值删除 Pandas 中的 DataFrame 行的重复问题。 - CodeLikeBeaker
2个回答

42

通用的布尔索引

df[df['Species'] != 'Cat']
# df[df['Species'].ne('Cat')]

  Index    Name Species
1     1    Jill     Dog
3     3   Harry     Dog
4     4  Hannah     Dog

df.query

df.query("Species != 'Cat'")

  Index    Name Species
1     1    Jill     Dog
3     3   Harry     Dog
4     4  Hannah     Dog

了解有关 pd.eval() 函数系列的信息、其特点和用例,请访问Dynamic Expression Evaluation in pandas using pd.eval()


df.isin

df[~df['Species'].isin(['Cat'])]

  Index    Name Species
1     1    Jill     Dog
3     3   Harry     Dog
4     4  Hannah     Dog

1
我刚刚为你的每个答案点了四次赞。可惜,SO没有识别这些点击。 - Scott Boston
"AttributeError: 'DataFrame' 对象没有 'Species' 属性" - 我做错了什么? - James Geddes
3
如果你正在使用与你发布的帖子相同的数据,那就是原因。你的输入数据有问题。尝试使用这个:pet_names = [["Jack","Cat"], ["Jill","Dog"], ["Tom","Cat"], ["Harry","Dog"] ,["Hannah","Dog"] ]; df = pd.DataFrame(pet_names,columns =["Name","Species"])(来自Bharath的帖子)。 - cs95
@ScottBoston 哈哈哈如果可能的话! - cs95
1
多项选择 +1 - Bharath M Shetty
1
现在你有我的赞同。另外,我建议使用 df.query,尤其是在多索引的情况下。 - BENY

1

你的代码 df[df['Species']!='Cat'] 是正确的。问题出在你的数据框初始化代码上。请看用户 cs95 的其他评论。

虽然另一个答案是正确的,但我更喜欢使用 drop() 删除行,因为它比使用相反的逻辑(保留不是“cat”的行)更加直接。对于像这样的简单示例没有区别,但如果你开始有更复杂的逻辑来确定要删除哪些行,那就很重要了。例如,删除满足A=1 AND (B=2 OR C=3)条件的行。

以下是如何使用带有条件逻辑的 drop()

df.drop( df.query(" `Species`=='Cat' ").index)

这是一种更可扩展的语法,用于更复杂的逻辑。


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