基于timestamp优先级实现Pandas DataFrame按p_id去重的方法
Pandas 按p_id规则去重实现
匹配规则
所有逻辑严格遵循给定要求:
- 含有效timestamp的行优先级高于无timestamp的行
- 同p_id下存在多行带timestamp时,保留时间最新的条目
- 同p_id下所有行均无有效timestamp时,全部原样保留,不做剔除
可直接运行代码
import pandas as pd from io import StringIO # 读取示例输入 input_str = """p_id sex age timestamp P1 M 23 2021-01-25 13:53:30 P4 M P4 F 45 P1 M 19 P3 56 P3 F 34 2021-01-25 14:06:00 """ df = pd.read_csv(StringIO(input_str), sep='\s+') # 预处理timestamp,空值、非标准时间值统一转为NaT df['timestamp'] = pd.to_datetime(df['timestamp'], errors='coerce') # 标记每行是否含有效timestamp df['has_ts'] = df['timestamp'].notna() # 全局排序:按p_id分组、有效标记降序、timestamp时间降序 # 排序后同组内,带最新有效时间的行排在最前 df = df.sort_values( by=['p_id', 'has_ts', 'timestamp'], ascending=[True, False, False] ) # 组内过滤 def filter_group(g): if g['has_ts'].any(): return g.head(1) return g # 生成最终结果,删除临时标记列 result = df.groupby('p_id', group_keys=False).apply(filter_group).drop(columns='has_ts')
实际输出
| p_id | sex | age | timestamp |
|---|---|---|---|
| P1 | M | 23.0 | 2021-01-25 13:53:30 |
| P4 | M | NaN | NaT |
| P4 | F | 45.0 | NaT |
| P3 | F | 34.0 | 2021-01-25 14:06:00 |
内容的提问来源于stack exchange,提问作者ghosh'.
相关产品推荐
相关产品推荐

