如何保留pandas DataFrame中每年度、月度首次出现日期对应的行
解决方案
核心思路是使用Pandas向量化操作实现需求,完全避免循环,性能远高于自定义循环实现,以下是两种常用实现方案:
方案1:基于分组最小日期筛选(无需提前排序,结果保留原始行顺序)
import pandas as pd # 示例数据构造,你已经转了date为datetime可跳过这步 df = pd.DataFrame([['2016-02-05', 22], ['2016-02-15', 15], ['2016-05-03', 18], ['2016-05-20', 9], ['2017-03-02', 10], ['2018-04-01', 11], ['2018-04-02', 12]], columns=['date', 'qty']) df['date'] = pd.to_datetime(df['date']) # 核心操作:按年月分组取每组最小日期,筛选对应行 min_date_mask = df['date'] == df.groupby([df['date'].dt.year, df['date'].dt.month])['date'].transform('min') result = df[min_date_mask]
输出结果和期望完全一致:
date qty 0 2016-02-05 22 2 2016-05-03 18 4 2017-03-02 10 5 2018-04-01 11
方案2:基于周期去重(代码更简洁,适合已按日期升序排序的数据集)
如果你的数据集已经提前按date列升序排序,直接用下面一行代码即可实现:
result = df[~df['date'].dt.to_period('M').duplicated(keep='first')]
说明:dt.to_period('M')会将日期转换为YYYY-MM格式的年月周期,duplicated(keep='first')会标记重复的周期,取反后就只保留每个周期第一次出现的行,也就是对应月份最早的日期行。
内容的提问来源于stack exchange,提问作者zyzzler
相关产品推荐
相关产品推荐

