我想删除仅包含不小于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实现这一点而不是遍历所有行?
答案 0 :(得分: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
答案 1 :(得分:1)
dropped_df = df.loc[((df<10) | (df>25)).any(1)]
df<10
将返回布尔df |
是OR运算符.any(1)
返回第1轴(行)see documentation上的所有true元素df.loc[]
然后根据布尔df过滤数据框