需要用现有行更新重复项
Need to update duplicate with existing rows
我需要根据以下条件更新(清理)我的数据
检查PS-id是否有重复值。
检查哪个有最新的日期
用旧的 更新具有最新的 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
我需要根据以下条件更新(清理)我的数据
检查PS-id是否有重复值。
检查哪个有最新的日期
用旧的 更新具有最新的 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