我想删除仅包含小于 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 实现这一点,而不是遍历所有行?
您可以调用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)
您可以使用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 过滤数据帧| 归档时间: |
|
| 查看次数: |
14728 次 |
| 最近记录: |