首页 > 解决方案 > 根据另一列的条件从 Pandas 数据框中删除重复项

问题描述

我需要p_id从以下 Pandas 数据框中删除相同的重复行,但使用以下条件:

  1. 最高保留优先级应给予包含时间戳变量的行
  2. 如果存在多行带有时间戳,则应将保留优先级赋予最新的
  3. 如果所有重复实例不包含时间戳,请保持原样

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 

预期输出

p_id    sex     age     timestamp
P1      M       23      2021-01-25 13:53:30
P4      M
P4      F       45
P3      F       34      2021-01-25 14:06:00 

标签: pythonpandas

解决方案


一种可能性是首先确定一个 id 的所有日期都为 null 的位置,然后与 a 的结果连接.drop_duplicates

df['timestamp'] = pd.to_datetime(df['timestamp'])
df = df.sort_values(['p_id','timestamp'], ascending=[True,False])

mask = df.groupby('p_id')['timestamp'].transform('count') == 0
all_nans = df[mask]

valid_dates = df[df['timestamp'].notna()].drop_duplicates('p_id', keep = 'first')

pd.concat([all_nans, valid_dates])
#output:

    p_id    sex age     timestamp
0   P1      M   23.0    2021-01-25 13:53:30
5   P3      F   34.0    2021-01-25 14:06:00
1   P4      M   NaN     NaT
2   P4      F   45.0    NaT

推荐阅读