Pandas DataFrame条件处理:同ID近2天重复行去重方法咨询
Pandas实现基于ID和日期间隔的行保留规则
首先明确你的需求场景:
原始DataFrame:
| ID | Date | Event_Type |
|---|---|---|
| 1 | 01/01/2019 | A |
| 1 | 01/01/2019 | B |
| 2 | 02/01/2019 | A |
| 3 | 02/01/2019 | A |
期望输出:
| ID | Date |
|---|---|
| 1 | 01/01/2019 |
| 2 | 02/01/2019 |
| 3 | 02/01/2019 |
核心规则:同一ID下,日期间隔≤2天的重复行只保留一行;间隔>2天的行全部保留。
下面是具体的实现步骤,每一步都有详细解释:
步骤1:准备数据并转换日期格式
首先要把Date列从字符串转为datetime类型,这是计算日期间隔的前提:
import pandas as pd # 构造你的原始数据(如果是读取外部文件,用pd.read_csv等即可) df = pd.DataFrame({ 'ID': [1, 1, 2, 3], 'Date': ['01/01/2019', '01/01/2019', '02/01/2019', '02/01/2019'], 'Event_Type': ['A', 'B', 'A', 'A'] }) # 转换Date列为datetime格式,注意这里的日期格式是dd/mm/yyyy df['Date'] = pd.to_datetime(df['Date'], format='%d/%m/%Y')
步骤2:分组处理每个ID的日期
我们需要按ID分组,对每个组内的日期进行排序、计算间隔,然后过滤出符合规则的行:
def filter_date_group(group): # 先按日期排序,确保相邻日期是连续的 group_sorted = group.sort_values('Date') # 计算当前日期与前一行日期的间隔天数 group_sorted['date_diff'] = group_sorted['Date'].diff().dt.days # 标记需要保留的行:组内第一行(diff结果为NaN) 或者 间隔>2天的行 keep_mask = group_sorted['date_diff'].isna() | (group_sorted['date_diff'] > 2) # 返回过滤后的行,并删除临时的date_diff列 return group_sorted[keep_mask].drop(columns='date_diff') # 应用分组过滤函数,group_keys=False避免保留分组索引 filtered_df = df.groupby('ID', group_keys=False).apply(filter_date_group)
步骤3:提取需要的列并整理结果
最后只保留ID和Date列,重置索引即可得到期望结果:
final_result = filtered_df[['ID', 'Date']].reset_index(drop=True) print(final_result)
运行后输出:
ID Date 0 1 2019-01-01 1 2 2019-01-02 2 3 2019-01-02
额外测试场景验证
如果你的数据中有同一ID下间隔超过2天的日期,比如:
test_df = pd.DataFrame({ 'ID': [1,1,1,2], 'Date': ['01/01/2019', '02/01/2019', '05/01/2019', '02/01/2019'], 'Event_Type': ['A','B','C','A'] })
处理后会得到:
ID Date 0 1 2019-01-01 1 1 2019-01-05 2 2 2019-01-02
完全符合规则:01/01和02/01间隔1天(≤2),只保留第一行;01/01和05/01间隔4天(>2),保留两行。
内容的提问来源于stack exchange,提问作者alwayscurious
相关产品推荐
相关产品推荐

