如何用Pandas按条件提取数据首尾信息并生成汇总表?
Pandas 按分组提取指定状态记录及最后一条记录
问题描述
原始DataFrame结构
no date status row_ant 1 11 Jan 2023, 07.00 ANT 1 1 11 Jan 2023, 09.00 AU 2 1 12 Jan 2023, 12.00 DLV 3 2 14 Jan 2023, 09.00 BA 1 2 14 Jan 2023, 10.00 AU 2 2 15 Jan 2023, 10.00 ANT 3 3 15 Jan 2023, 09.00 ANT 1 3 16 Jan 2023, 10.00 AU 2 3 16 Jan 2023, 10.00 ANT 3
需求说明
需要生成汇总表,包含:
- 每个
no中满足status = ANT且row_ant = 1的第一条date和对应的first_status - 每个
no的最后一条date和对应的last_status - 仅保留存在符合
status = ANT且row_ant = 1记录的no(示例中no=2不符合条件,不保留)
期望结果
no date_ant first_status date_last_status last_status 1 11 Jan 2023, 07.00 ANT 12 Jan 2023, 12.00 DLV 3 15 Jan 2023, 09.00 ANT 16 Jan 2023, 10.00 ANT
当前代码问题
目前仅实现了提取日期的最小最大值,但无法获取对应状态:
df = pd.DataFrame(df.groupby(['no','status','row_ant']) .agg({'date':['min','max']}) .rename(columns={'min':'date_ant','max':'date_last_status'})).reset_index()
解决方案
可以分三步处理:筛选指定条件的ANT记录、提取每个分组的最后一条记录、合并结果并过滤无效分组。
代码实现
import pandas as pd # 假设原始数据已加载到df中 # 1. 筛选status=ANT且row_ant=1的记录,重命名列 ant_records = df[(df['status'] == 'ANT') & (df['row_ant'] == 1)].rename( columns={'date': 'date_ant', 'status': 'first_status'} )[['no', 'date_ant', 'first_status']] # 2. 获取每个no的最后一条记录,重命名列 last_records = df.groupby('no').last().reset_index().rename( columns={'date': 'date_last_status', 'status': 'last_status'} )[['no', 'date_last_status', 'last_status']] # 3. 内连接合并,自动过滤无有效ANT记录的no result = pd.merge(ant_records, last_records, on='no', how='inner') print(result)
代码说明
- 筛选ANT记录:通过布尔索引精准定位符合条件的行,直接重命名列以匹配需求格式。
- 提取最后一条记录:
groupby('no').last()会自动保留每个分组的最后一行数据,再提取需要的列并重命名。 - 合并数据:内连接
merge只保留同时存在于两个DataFrame中的no,自然过滤掉像no=2这种没有符合条件ANT记录的分组。
内容的提问来源于stack exchange,提问作者nomnom3214
相关产品推荐
相关产品推荐

