Python Pandas 去除180天内同名重复记录的实现方案咨询
Pandas数据过滤实现方案
核心处理逻辑为按姓名分组后,逐行对比当前记录与同组内上一条保留记录的日期间隔,间隔大于180天则保留当前记录,否则删除。
步骤1:转换日期格式
首先将Date列从字符串格式转换为pandas datetime格式,用于时间差计算:
import pandas as pd # 构造原始数据 data_dict = {'Name':['John','John','John','John','John','John','Peter','Peter','Luke','Luke'], 'Date':['2021-03-01', '2021-08-01','2021-12-01', '2022-04-11', '2022-10-01','2023-12-01','2021-05-01','2021-12-31','2021-08-01','2021-11-01']} df = pd.DataFrame(data_dict) # 日期格式转换 df['Date'] = pd.to_datetime(df['Date'])
步骤2:定义分组过滤函数
自定义函数处理每个姓名对应的分组数据,跟踪上一条保留的记录做时间差判断:
def filter_interval(group): # 先对分组内的记录按日期升序排序,避免原始数据日期乱序导致计算错误 group = group.sort_values('Date').reset_index(drop=True) # 第一条记录默认保留 keep_idx = [0] for i in range(1, len(group)): # 计算当前记录与上一条保留记录的天数差 diff_days = (group.loc[i, 'Date'] - group.loc[keep_idx[-1], 'Date']).days if diff_days > 180: keep_idx.append(i) return group.loc[keep_idx]
步骤3:分组应用函数得到最终结果
dfa = df.groupby('Name', group_keys=False).apply(filter_interval).reset_index(drop=True) # 若需要将日期转回字符串格式,可执行下行代码 dfa['Date'] = dfa['Date'].dt.strftime('%Y-%m-%d')
运行后得到的dfa与给出的预期输出完全一致。
内容的提问来源于stack exchange,提问作者Zach
相关产品推荐
相关产品推荐

