如何在Pandas中按Serial分组并筛选最大日期对应的行?
解决按分组保留最大日期行的问题
你的问题出在直接将df赋值为分组聚合后的结果,导致丢失了Else等其他列。以下是两种可行的解决方案:
方法一:使用transform广播分组结果
transform可以将分组计算的最大日期广播到原DataFrame的每一行,直接进行行筛选:
import pandas as pd # 初始化原DataFrame df = pd.DataFrame({'Serial' : ['A1', 'A1', 'A1', 'B1','B1', 'B1'], 'Day' : ['01.01.2022', '01.01.2022', '01.01.2021', '01.01.2019', '01.01.2019', '01.01.2020'], 'Else' : ['a', 'b', 'c', 'd','e', 'f']}) # 转换Day列为datetime类型 df['Day'] = pd.to_datetime(df['Day'], format="%d.%m.%Y") # 计算每组的最大日期,并广播到原表每行 max_day_per_group = df.groupby('Serial')['Day'].transform('max') # 筛选出Day等于对应组最大日期的行 result = df[df['Day'] == max_day_per_group] # 可选:将Day列转回原字符串格式 result['Day'] = result['Day'].dt.strftime('%d.%m.%Y') print(result)
方法二:使用merge匹配分组最大日期
先单独计算每组的最大日期,再通过合并操作筛选匹配行:
import pandas as pd df = pd.DataFrame({'Serial' : ['A1', 'A1', 'A1', 'B1','B1', 'B1'], 'Day' : ['01.01.2022', '01.01.2022', '01.01.2021', '01.01.2019', '01.01.2019', '01.01.2020'], 'Else' : ['a', 'b', 'c', 'd','e', 'f']}) df['Day'] = pd.to_datetime(df['Day'], format="%d.%m.%Y") # 计算每组最大日期,重置索引保留Serial列 max_days = df.groupby('Serial')['Day'].max().reset_index() # 合并原表与最大日期表,筛选匹配行 result = pd.merge(df, max_days, on=['Serial', 'Day']) # 转回日期字符串格式 result['Day'] = result['Day'].dt.strftime('%d.%m.%Y') print(result)
两种方法都能得到你想要的结果,其中transform方法更简洁高效,适合处理较大数据集。
内容的提问来源于stack exchange,提问作者Ta a Le
相关产品推荐
相关产品推荐

