Pandas分组条件筛选:选取每组Name列首次出现1后的所有行
Pandas分组筛选:保留每个分组中Name列首次出现1后的所有行
需求说明
对Pandas DataFrame按Group列分组,为每个分组保留Name列首次出现值1之后的所有行(包含首次出现1的那一行)。
待处理DataFrame
| Group | Name | Value |
|---|---|---|
| A | 0 | 10 |
| A | 0 | 20 |
| A | 1 | 30 |
| A | 0 | 40 |
| A | 1 | 50 |
| B | 0 | 60 |
| B | 1 | 70 |
| B | 0 | 80 |
预期结果
| Group | Name | Value |
|---|---|---|
| A | 1 | 30 |
| A | 0 | 40 |
| A | 1 | 50 |
| B | 1 | 70 |
| B | 0 | 80 |
解决方案
使用groupby结合累积最大值函数cummax()即可实现需求,代码如下:
import pandas as pd # 构造与示例一致的DataFrame df = pd.DataFrame({ 'Group': ['A', 'A', 'A', 'A', 'A', 'B', 'B', 'B'], 'Name': [0, 0, 1, 0, 1, 0, 1, 0], 'Value': [10, 20, 30, 40, 50, 60, 70, 80] }) # 分组筛选逻辑 result = df.groupby('Group').apply( lambda g: g[g['Name'].cummax() == 1] ).reset_index(drop=True) print(result)
代码解释
groupby('Group'):按分组列对DataFrame拆分g['Name'].cummax():对每个分组的Name列计算累积最大值,首次出现1后,后续所有行的累积最大值都会保持为1g[g['Name'].cummax() == 1]:筛选出累积最大值为1的行,即首次出现1之后的所有行(含首次出现1的行)reset_index(drop=True):重置结果的索引,消除分组带来的多级索引问题
内容的提问来源于stack exchange,提问作者Eashwar GV
相关产品推荐
相关产品推荐

