我想删除仅包含小于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实现,而不是遍历所有行?
您可以调用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
dropped_df = df.loc[((df<10) | (df>25)).any(1)]
df<10
将返回布尔df|
是OR运算符.any(1)
返回轴1(行)see documentation]上的任何真元素。df.loc[]
然后根据布尔df过滤数据帧