Python中按指定列分组,筛选目标值首次出现及之前的行
问题:按分组保留首次出现指定值的行及之前所有行
问题场景
我有如下包含重复值的DataFrame:
Column A Column B MD223 GATE IN MD223 GATE OUT MD223 LOADED MD223 DEPARTURE MD223 LOADED SC511 GATE IN SC511 LOADED SC511 SHIPPED SC511 LOADED KR977 DISPATCHED KR977 LOADED KR977 SHIPPED
需求:按Column A分组,找到每组中Column B首次出现'LOADED'的行,返回该行及之前的所有行。预期结果:
Column A Column B MD223 GATE IN MD223 GATE OUT MD223 LOADED SC511 GATE IN SC511 LOADED KR977 DISPATCHED KR977 LOADED
解决方案
使用Pandas的分组与索引定位功能即可实现,代码如下:
import pandas as pd # 构造示例DataFrame data = { 'Column A': ['MD223', 'MD223', 'MD223', 'MD223', 'MD223', 'SC511', 'SC511', 'SC511', 'SC511', 'KR977', 'KR977', 'KR977'], 'Column B': ['GATE IN', 'GATE OUT', 'LOADED', 'DEPARTURE', 'LOADED', 'GATE IN', 'LOADED', 'SHIPPED', 'LOADED', 'DISPATCHED', 'LOADED', 'SHIPPED'] } df = pd.DataFrame(data) # 分组处理:保留每组首次出现LOADED的行及之前所有行 result = df.groupby('Column A').apply( lambda x: x.loc[:x[x['Column B'] == 'LOADED'].index[0]] ).reset_index(drop=True) print(result)
代码说明
- 分组:通过
groupby('Column A')按指定列对数据分组; - 定位首次出现位置:对每个分组,用
x[x['Column B'] == 'LOADED'].index[0]获取'LOADED'首次出现的行索引; - 截取目标行:使用
loc[:索引值]截取分组开头到目标索引的所有行; - 重置索引:
reset_index(drop=True)清除分组生成的多级索引,得到规整的结果。
如果需要兼容部分分组无'LOADED'值的情况,可添加判断避免报错:
result = df.groupby('Column A').apply( lambda x: x.loc[:x[x['Column B'] == 'LOADED'].index[0]] if not x[x['Column B'] == 'LOADED'].empty else x ).reset_index(drop=True)
这段代码会保留无'LOADED'分组的全部行,防止索引查找报错。
内容的提问来源于stack exchange,提问作者just_learning
相关产品推荐
相关产品推荐

