熊猫删除行与过滤器

ojo*_*jon 8 python dataframe pandas data-science

I have a pandas dataframe and want to get rid of rows in which the column 'A' is negative. I know 2 ways to do this:

df = df[df['A'] >= 0]
Run Code Online (Sandbox Code Playgroud)

or

selRows = df[df['A'] < 0].index
df = df.drop(selRows, axis=0)
Run Code Online (Sandbox Code Playgroud)

What is the recommended solution? Why?

VaM*_*VaM 7

推荐的解决方案是最有效的,在这种情况下,它是第一个。

df = df[df['A'] >= 0]
Run Code Online (Sandbox Code Playgroud)

关于第二种解决方案

selRows = df[df['A'] < 0].index
df = df.drop(selRows, axis=0)
Run Code Online (Sandbox Code Playgroud)

您正在重复切片过程。但是让我们把它分解成碎片来理解为什么。

当你写

df['A'] >= 0
Run Code Online (Sandbox Code Playgroud)

您正在创建一个掩码,一个布尔系列,其中包含 df 的每个索引的条目,其值根据条件为 True 或 False(在这种情况下,如果给定索引处的列“A”的值大于或等于 0)。

当你写

df[df['A'] >= 0]
Run Code Online (Sandbox Code Playgroud)

您访问掩码 (df['A'] >= 0) 为 True 的行。这是 Pandas 支持的一种切片方法,它允许您通过传递布尔系列来选择某些行,并返回原始 DataFrame 的视图,其中仅包含系列为 True 的条目。

最后,当你写这个

selRows = df[df['A'] < 0].index
df = df.drop(selRows, axis=0)
Run Code Online (Sandbox Code Playgroud)

你正在重复这个过程,因为

df[df['A'] < 0]
Run Code Online (Sandbox Code Playgroud)

已经在切片您的 DataFrame (在这种情况下,您要删除的行)。然后您将获得这些索引,返回到原始 DataFrame 并显式删除它们。不需要这个,你已经在第一步中对 DataFrame 进行了切片。