Pandas 删除行与过滤器
Pandas drop rows vs filter
我有一个 pandas 数据框,我想删除 'A' 列为负数的行。我知道有两种方法可以做到这一点:
df = df[df['A'] >= 0]
或
selRows = df[df['A'] < 0].index
df = df.drop(selRows, axis=0)
推荐的解决方案是什么?为什么?
你的问题是这样的:"I have two identical cakes, but one has icing. Which has more calories?"
第二个解决方案是做同样的事情但是两次。一个过滤步骤就足够了,不需要过滤,然后然后冗余地继续调用一个函数,该函数的功能与上一步的过滤操作完全相同。
澄清一下:无论操作如何,您仍在做同样的事情:生成布尔掩码,然后进行索引。
推荐的解决方案是最有效的,在本例中是第一个。
df = df[df['A'] >= 0]
关于第二种解决方案
selRows = df[df['A'] < 0].index
df = df.drop(selRows, axis=0)
您正在重复切片过程。但是让我们把它分解成碎片来理解为什么。
写的时候
df['A'] >= 0
您正在创建一个掩码,一个布尔系列,其中 df 的每个索引都有一个条目,根据条件其值为 True 或 False(在这种情况下,如果这样,列 'A' 的值在给定索引处大于或等于 0)。
写的时候
df[df['A'] >= 0]
您正在访问掩码 (df['A'] >= 0) 为 True 的行。这是 Pandas 支持的切片方法,它允许您通过传递布尔系列 select 某些行,并将 return 原始 DataFrame 的视图,其中仅包含系列为 True 的条目.
最后,当你写这篇文章时
selRows = df[df['A'] < 0].index
df = df.drop(selRows, axis=0)
你正在重复这个过程,因为
df[df['A'] < 0]
已经在对您的 DataFrame 进行切片(在这种情况下,您想要 删除 的行)。然后您将获得这些索引,返回到原始 DataFrame 并显式删除它们。不需要这个,您已经在第一步中对 DataFrame 进行了切片。
df = df[df['A'] >= 0]
确实是更快的解决方案。请注意,它 returns 是原始数据框的 view,而不是新数据框。这可能会给您带来麻烦,例如当您想要更改其值时,因为 pandas 会给您 SettingwithCopyWarning
.
简单的修复当然是文本推荐的:
df = df[df['A'] >= 0].copy()
我有一个 pandas 数据框,我想删除 'A' 列为负数的行。我知道有两种方法可以做到这一点:
df = df[df['A'] >= 0]
或
selRows = df[df['A'] < 0].index
df = df.drop(selRows, axis=0)
推荐的解决方案是什么?为什么?
你的问题是这样的:"I have two identical cakes, but one has icing. Which has more calories?"
第二个解决方案是做同样的事情但是两次。一个过滤步骤就足够了,不需要过滤,然后然后冗余地继续调用一个函数,该函数的功能与上一步的过滤操作完全相同。
澄清一下:无论操作如何,您仍在做同样的事情:生成布尔掩码,然后进行索引。
推荐的解决方案是最有效的,在本例中是第一个。
df = df[df['A'] >= 0]
关于第二种解决方案
selRows = df[df['A'] < 0].index
df = df.drop(selRows, axis=0)
您正在重复切片过程。但是让我们把它分解成碎片来理解为什么。
写的时候
df['A'] >= 0
您正在创建一个掩码,一个布尔系列,其中 df 的每个索引都有一个条目,根据条件其值为 True 或 False(在这种情况下,如果这样,列 'A' 的值在给定索引处大于或等于 0)。
写的时候
df[df['A'] >= 0]
您正在访问掩码 (df['A'] >= 0) 为 True 的行。这是 Pandas 支持的切片方法,它允许您通过传递布尔系列 select 某些行,并将 return 原始 DataFrame 的视图,其中仅包含系列为 True 的条目.
最后,当你写这篇文章时
selRows = df[df['A'] < 0].index
df = df.drop(selRows, axis=0)
你正在重复这个过程,因为
df[df['A'] < 0]
已经在对您的 DataFrame 进行切片(在这种情况下,您想要 删除 的行)。然后您将获得这些索引,返回到原始 DataFrame 并显式删除它们。不需要这个,您已经在第一步中对 DataFrame 进行了切片。
df = df[df['A'] >= 0]
确实是更快的解决方案。请注意,它 returns 是原始数据框的 view,而不是新数据框。这可能会给您带来麻烦,例如当您想要更改其值时,因为 pandas 会给您 SettingwithCopyWarning
.
简单的修复当然是文本推荐的:
df = df[df['A'] >= 0].copy()