【问题标题】:Pandas drop rows vs filter熊猫丢弃行与过滤器
【发布时间】:2018-11-14 08:01:45
【问题描述】:

我有一个 pandas 数据框,想要删除“A”列为负数的行。我知道两种方法:

df = df[df['A'] >= 0]

selRows = df[df['A'] < 0].index
df = df.drop(selRows, axis=0)

推荐的解决方案是什么?为什么?

【问题讨论】:

  • 推荐df[df['A'] &gt;= 0].copy()
  • 还有:df.query(“A >= 0”)
  • 请注意,我是在我的 iPhone 上写的,当时我坐在我的小型货车里等我的妻子……这意味着“用实际上是代码而不是愚蠢的东西的引号替换我的引号 OS X自动为我替换”
  • @piRSquared 每段代码都有一个背景故事......
  • @coldspeed 和大多数我们可能不想知道的(-:包括我上面的代码

标签: python pandas dataframe data-science


【解决方案1】:

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

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 支持的一种切片方法,可让您通过传递布尔系列来选择某些行,并将返回原始 DataFrame 的视图,其中仅包含系列为 True 的条目。

最后,当你写这篇文章时

selRows = df[df['A'] < 0].index
df = df.drop(selRows, axis=0)

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

df[df['A'] < 0]

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

【讨论】:

    【解决方案2】:
    df = df[df['A'] >= 0]
    

    确实是更快的解决方案。请注意,它返回的是原始数据框的 view,而不是新的数据框。这可能会给您带来麻烦,例如当您想更改其值时,因为 pandas 会给您SettingwithCopyWarning

    文本推荐的当然是简单的解决方法:

    df = df[df['A'] >= 0].copy()
    

    【讨论】:

      【解决方案3】:

      你的问题是这样的:“我有两个一模一样的蛋糕,但一个有糖霜。哪个卡路里更高?”

      第二种解决方案是做同样的事情但两次。一个过滤步骤就足够了,不需要过滤,然后冗余地继续调用一个函数,该函数与上一步中的过滤操作完全相同。

      澄清一下:不管操作如何,你仍然在做同样的事情:生成一个布尔掩码,然后进行索引。

      【讨论】:

        猜你喜欢
        • 2019-12-12
        • 1970-01-01
        • 2018-12-15
        • 2013-01-10
        • 2017-11-17
        • 1970-01-01
        • 2017-05-22
        • 2021-08-20
        • 1970-01-01
        相关资源
        最近更新 更多