Pandas 删除值小于给定值的行

Jas*_*mar 4 python pandas

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

a   b   c  
1   2   3  
4   5   16  
11  24  22  
26  50  65  
Run Code Online (Sandbox Code Playgroud)

预期输出:

a   b   c  
1   2   3  
4   5   16   
26  50  65  
Run Code Online (Sandbox Code Playgroud)

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

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

Rak*_*van 6

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

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)
Run Code Online (Sandbox Code Playgroud)

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

检查这是如何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
Run Code Online (Sandbox Code Playgroud)


Pra*_*ssa 5

您可以使用pandas 布尔索引

dropped_df = df.loc[((df<10) | (df>25)).any(1)]
Run Code Online (Sandbox Code Playgroud)
  • df<10将返回一个布尔值 df
  • |是 OR 运算符
  • .any(1)返回轴 1(行)上的任何真实元素,请参阅文档
  • df.loc[]然后根据布尔 df 过滤数据帧