基于其他列删除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
相关产品推荐
相关产品推荐

