Pandas数据处理:按ID分组移除日期间隔小于30天的行
解决同一ID下日期间隔小于30天的行移除问题
嘿,这个需求我之前处理过,咱们一步步来实现你要的效果:
首先,先明确原始数据和需求:我们有下面这个DataFrame,需要移除同一ID下,与同组内已保留行日期间隔小于30天的行,最终保留符合条件的记录。
原始数据定义
import pandas as pd dfx = pd.DataFrame({ "ID": ["A", "A", "C", "B", "B"], "date": ["01/01/2014", "01/31/2014", "01/23/2014", "01/01/2014", "01/20/2014"] })
实现步骤
1. 转换日期格式
首先得把字符串类型的date列转换成datetime类型,这样才能计算日期之间的差值:
# 将date列转为datetime格式,指定输入格式为月/日/年 dfx['date'] = pd.to_datetime(dfx['date'], format='%m/%d/%Y')
2. 分组计算日期差并筛选
接下来按ID分组,先对每组内的日期排序,然后计算当前行与前一行的天数差,最后筛选出符合条件的行:
# 按ID和日期排序,确保同一ID内的日期是时间顺序 dfx_sorted = dfx.sort_values(['ID', 'date']) # 计算每组内当前行与前一行的日期差(单位:天) dfx_sorted['days_diff'] = dfx_sorted.groupby('ID')['date'].diff().dt.days # 筛选规则:保留组内第一行(无前置行,days_diff为NaN),或与前一行间隔≥30天的行 filtered_df = dfx_sorted[(dfx_sorted['days_diff'].isna()) | (dfx_sorted['days_diff'] >= 30)] # 移除临时的days_diff列,得到最终结果 filtered_df = filtered_df.drop('days_diff', axis=1) # 可选:如果需要恢复原始DataFrame的行顺序,按原始索引排序 filtered_df = filtered_df.sort_index()
最终结果
运行上述代码后,filtered_df就是你要的结果:
ID date 0 A 2014-01-01 1 A 2014-01-31 2 C 2014-01-23 3 B 2014-01-01
简单解释下逻辑:
- 排序是为了保证同一ID内的日期按时间先后排列,这样计算的差值才是相邻时间的间隔
- 组内第一行必然保留,因为没有其他行可以对比
- 后续行只有和上一个保留的行间隔≥30天才会被保留,刚好符合你定义的“非重复项”规则
内容的提问来源于stack exchange,提问作者markH
相关产品推荐
相关产品推荐

