You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

代码说明

  1. 分组:通过groupby('Column A')按指定列对数据分组;
  2. 定位首次出现位置:对每个分组,用x[x['Column B'] == 'LOADED'].index[0]获取'LOADED'首次出现的行索引;
  3. 截取目标行:使用loc[:索引值]截取分组开头到目标索引的所有行;
  4. 重置索引: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 06:35:13