需要用现有行更新重复项

Need to update duplicate with existing rows

我需要根据以下条件更新(清理)我的数据

  1. 检查PS-id是否有重复值。

  2. 检查哪个有最新的日期

  3. 用旧的 更新具有最新的 Date 和新的 Cam 的旧行凸轮

    ID       Cam                PS-id             Date
    A1       Alto-Car           A1222             1.1.2022     
    B1       BMW-Car            A123              1.1.2022
    A5       Car-Alto           A1222             5.1.2022    
    

理想的输出应该是这样的

ID       Cam                PS-id             Date
A1       Car-Alto           A1222             5.1.2022     
B1       BMW-Car            A123              1.1.2022

我尝试了一些解决方案,但根据我的条件无法做到

IIUC,你想要 groupby+idxmax and groupby+first, that you merge:

的组合
# get indices of latest (max) dates
# here we keep the string format
# if you want to convert to datetime
# df['Date'] = pd.to_datetime(df['Date'])
idx = pd.to_datetime(df['Date']).groupby(df['PS-id']).idxmax().values

# slice the rows with max dates
(df.loc[idx]
   # and merge back first id
   .merge(df.groupby('PS-id')['ID'].first(),
          left_on='PS-id', right_index=True, suffixes=('_', ''))
   .drop('ID_', axis=1)[df.columns]
)

输出:

   ID       Cam  PS-id      Date
2  A1  Car-Alto  A1222  5.1.2022
1  B1   BMW-Car   A123  1.1.2022

将值转换为 Date 列中的日期时间,然后按两列排序,因此第一行是 DataFrame.drop_duplicates 创建的旧行并​​转换为 Series 用于重新分配 [=14] =] 按每个 PS-id:

具有最大值的行
df['Date'] = pd.to_datetime(df['Date'], format='%m.%d.%Y')
df = df.sort_values(['PS-id','Date'])

s = df.drop_duplicates('PS-id').set_index('PS-id')['ID']
df = df.drop_duplicates('PS-id', keep='last').assign(ID = lambda x: x['PS-id'].map(s))
print (df)
   ID       Cam  PS-id       Date
2  A1  Car-Alto  A1222 2022-05-01
1  B1   BMW-Car   A123 2022-01-01