【问题标题】:Pandas drop rows with value less than a given value熊猫丢弃值小于给定值的行
【发布时间】:2017-11-17 01:33:33
【问题描述】:

我想删除仅包含小于 10 且大于 25 的值的行。我的示例数据框将如下所示:

a   b   c  
1   2   3  
4   5   16  
11  24  22  
26  50  65  

预期输出:

a   b   c  
1   2   3  
4   5   16   
26  50  65  

因此,如果该行包含小于 10 或大于 25 的任何值,则该行将保留在数据框中,否则需要将其删除。

有什么方法可以用 Pandas 实现这一点,而不是遍历所有行?

【问题讨论】:

  • 祝你好运。我希望你能照顾好你的行。
  • 仅供参考,这不是您在 SO 上提问的方式。你应该表现出一些最小的努力。如果您有资源在这里提出问题,那么您也有资源可以自己进行一些搜索。
  • 为什么第一行和最后一行仍在您的预期输出中?这没有任何意义。
  • 您能更好地解释您的删除标准吗?如果 any 值小于 10 且大于 25,您会删除一行吗?还是所有的值?示例输入和输出没有意义
  • 如果该行的值小于 10 或大于 25,则该行将保留在数据框中,否则需要删除。

标签: python pandas


【解决方案1】:

您可以使用pandas boolean indexing

dropped_df = df.loc[((df<10) | (df>25)).any(1)]
  • df&lt;10 将返回一个布尔值 df
  • | 是 OR 运算符
  • .any(1) 返回轴 1(行)上的任何真实元素 see documentation
  • df.loc[] 然后根据布尔 df 过滤数据帧

【讨论】:

    【解决方案2】:

    您可以调用apply 并将结果返回到名为“保持”的新列。然后,您可以使用此列删除不需要的行。

    import pandas as pd
    l = [[1,2,3],[4,5,6],[11,24,22],[26,50,65]]
    df = pd.DataFrame(l, columns = ['a','b','c']) #Set up sample dataFrame
    
    df['keep'] = df.apply(lambda row: sum(any([(x < 10) or (x > 25) for x in row])), axis = 1)
    

    any() 函数返回一个生成器。调用sum(generator) 只返回生成器中存储的所有结果的总和。

    检查 this 以了解 any() 的工作原理。 Apply 函数仍然像 for 循环一样遍历所有行,但这样代码看起来更简洁。如果不遍历所有行,我想不出一种方法来做到这一点。

    输出:

        a   b   c  keep
    0   1   2   3     1
    1   4   5   6     1
    2  11  24  22     0
    3  26  50  65     1
    
    
    df = df[df['keep'] == 1] #Drop unwanted rows
    

    【讨论】:

    • 很好的答案!我是熊猫的新手,想知道这是否更有效地“循环”数据框。我不知道 panda 的数据框是如何在幕后实现的,但这似乎是对其进行了两次迭代。你能指出我对此的一些解释吗?
    • Apply 函数只是循环的语法糖。即使您编写了一个 for 循环来遍历所有行,我也不确定是否有办法即时删除行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-14
    • 2018-12-15
    • 2013-01-10
    • 1970-01-01
    • 2020-04-28
    • 2017-07-21
    相关资源
    最近更新 更多