Вы должны дублировать при выполнении соединения, например:
import pandas as pd
left_data = {'name':['John','Mark'],'value':[1,5]}
right_data = {'name':['John','Mark','John','Mark'],'children':['Celius','Stingher','Celius','Stingher'],'process_date':['2019-02-05','2019-02-05','2019-03-05','2019-03-05']}
left_df = pd.DataFrame(left_data)
right_df = pd.DataFrame(right_data)
right_df['process_date'] = pd.to_datetime(right_df['process_date'])
Вот как они выглядят:
print(left_df)
name value
0 John 1
1 Mark 5
print(right_df)
name children process_date
0 John Celius 2019-02-05
1 Mark Stingher 2019-02-05
2 John Celius 2019-03-05
3 Mark Stingher 2019-03-05
Даже когда объединение left
с тех пор каккратны process_date
значениям в right_df
, поэтому кадр данных left
будет продублирован для того, чтобы соответствовать всем существам значений, переданным в кадре данных right
.
df = left_df.merge(right_df,how='left',left_on='name',right_on='name')
print(df)
name value children process_date
0 John 1 Celius 2019-02-05
1 John 1 Celius 2019-03-05
2 Mark 5 Stingher 2019-02-05
3 Mark 5 Stingher 2019-03-05
Один подход для фильтрации этогоэто .sort_values()
по определенному заказу, а затем .drop_duplicates(subset=list(left_df),keep={'last','first'})
. Таким образом, мы исключаем дубликаты строк и сохраняем самую последнюю доступную информацию:
df = df.sort_values('process_date',ascending=True).drop_duplicates(list(left_df),keep='last')
print(df)
name value children process_date
1 John 1 Celius 2019-03-05
3 Mark 5 Stingher 2019-03-05
Длина объединенного фрейма данных, соответствует длине left_df
.