如何获取各id对应的最新date1及其全部关联行?
获取Pandas DataFrame中每个id对应最新date1的所有条目
原始DataFrame
import pandas as pd from io import StringIO df = pd.read_csv(StringIO(""" id date1 date2 101 2021-10-01 2021-09-01 101 2021-11-01 2021-10-01 101 2021-11-01 2021-12-01 102 2022-09-01 2022-09-01 102 2022-11-01 2023-01-01 103 2021-10-01 2021-11-01 103 2021-10-01 2021-11-01 103 2021-12-01 2021-11-01 103 2021-12-01 2021-12-01 103 2021-12-01 2022-01-01"""), sep="\s+", parse_dates=["date1", "date2"])
需求
提取每个id对应的最新(最大)date1的所有条目,预期结果:
id date1 date2 101 2021-11-01 2021-10-01 101 2021-11-01 2021-12-01 102 2022-11-01 2023-01-01 103 2021-12-01 2021-11-01 103 2021-12-01 2021-12-01 103 2021-12-01 2022-01-01
解决方案
方法1:使用transform生成匹配掩码
通过groupby结合transform,为每一行生成对应id的最大date1,再用布尔索引筛选:
# 生成每个id对应的最大date1,广播到原DataFrame的每一行 max_date_per_id = df.groupby('id')['date1'].transform('max') # 筛选date1等于对应id最大date1的行 result = df[df['date1'] == max_date_per_id] # 可选:按id排序结果,和预期格式一致 result = result.sort_values('id').reset_index(drop=True) print(result)
transform会保留原DataFrame的行数,将每个组的最大值填充到该组的所有行,精准筛选出所有符合条件的条目。
方法2:使用groupby.filter
利用filter函数对每个分组进行条件判断,保留满足date1等于组内最大值的整个分组行:
# 先按id和date1排序(可选,仅为结果顺序和预期一致) df_sorted = df.sort_values(['id', 'date1']) # 筛选每个组中date1等于组内最大值的行 result = df_sorted.groupby('id').filter(lambda group: group['date1'] == group['date1'].max()) print(result)
filter会返回所有符合条件的分组的原始行,适合需要保留分组内所有匹配行的场景。
内容的提问来源于stack exchange,提问作者mockash
相关产品推荐
相关产品推荐

