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

基于其他列删除DataFrame中的指定数据行

解决方法

需求分析

按Id分组,每组内按日期排序后,移除最后一个空值status行及之前的所有行;若某个Id的最后一行是空值status,则该Id的所有行全部移除,最终只保留空值行之后的非空status数据。

代码实现

import pandas as pd

# 构造输入数据
data = {
    'Id': ['01', '01', '01', '01', '02', '02'],
    'date': ['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04', '2023-01-01', '2023-01-02'],
    'status': ['in progress', '', 'in progress', 'done', 'in progress', '']
}
df = pd.DataFrame(data)

# 1. 转换日期列格式,确保排序准确
df['date'] = pd.to_datetime(df['date'])

# 2. 按Id分组,每组内按日期升序排序
df = df.sort_values(['Id', 'date']).reset_index(drop=True)

# 3. 定义分组过滤逻辑
def filter_group(group):
    null_mask = group['status'].eq('')
    if not null_mask.any():
        # 分组内无空值status,直接返回(可按需调整)
        return group
    # 定位最后一个空值status行的索引
    last_null_idx = null_mask[null_mask].index[-1]
    # 截取空值行之后的内容,并过滤剩余空值
    after_last_null = group.loc[last_null_idx+1:]
    return after_last_null[after_last_null['status'].ne('')]

# 应用分组过滤
result_df = df.groupby('Id', group_keys=False).apply(filter_group)

print(result_df)

输出结果

Id       date      status
2  01 2023-01-03  in progress
3  01 2023-01-04         done

关键逻辑说明

  • 先将日期转为datetime类型,避免字符串排序的潜在错误。
  • 按Id分组后,每组内按日期排序,保证时间顺序的正确性。
  • 对每个分组:
    • 无空值status则直接保留;
    • 有则定位最后一个空值行,截取其后的内容并过滤剩余空值,只保留有效数据。

内容的提问来源于stack exchange,提问作者Teresa Sergiel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 14:47:44