Вывод Pandas Merge из двух фреймов данных не дает ожидаемой формы - PullRequest
1 голос
/ 03 октября 2019

Я объединяю два фрейма данных, используя «Слияние влево», однако количество строк в выходных данных не равно количеству строк в левом фрейме данных. Я ожидаю, что форма df_bd будет (58233, 10).

enter image description here

1 Ответ

0 голосов
/ 03 октября 2019

Вы должны дублировать при выполнении соединения, например:

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.

...