Как объединить DataFrame, слив одинаковые столбцы и строки с повторяющимися значениями в указанном столбце?

Есть три DataFrame:

1.

A B C
1 11a 4
2 11a None
3 11b 6

2.

A B D C
2 11a 12 42

3.

A B E
1 11a 45
2 11a 67
3 11b 23

Хочу объединить их, ориентируясь на столбец A. Гарантируется, что при одинаковых значениях в столбце A, в других столбцах значения одинаковые либо NaN.

Желаемый результат:

A B C D E
1 11a 4 NaN 45
2 11a 42 12 67
3 11b 6 NaN 23

У меня пока получилось только так:

import pandas as pd

df1 = pd.DataFrame({'A': ['1', '2', '3'], 'B': ['11a', '11a', '11b'], 'C': [4, None, 6]})
df2 = pd.DataFrame({'A': ['2'], 'B': ['11a'], 'D': [12], 'C': [42]})
df3 = pd.DataFrame({'A': ['1', '2', '3'], 'B': ['11a', '11a', '11b'], 'E': [45, 67, 23]})


df1 = pd.merge(df1, df2, on='A', how='outer')
df1 = pd.merge(df1, df3, on='A', how='outer')

Но результат далёк от желаемого:

A B C_x D C_y E
1 11a 4.0 NaN NaN 45
2 11a NaN 12.0 42.0 67
3 11b 6.0 NaN NaN 23

Подскажите, пожалуйста, как быть?


Ответы (1 шт):

Автор решения: Алексей Р

Можно попробовать так, без merge. Суть - объединяем все фреймы, группируем по A, затем в каждой группе оставляем одну строку, используя, например, max:

df = pd.concat([df1,df2,df3]).groupby('A',as_index=False).agg('max') # или .first()/.last() вместо .agg('max')

Вывод

   A    B    C     D     E
0  1  11a  4.0   NaN  45.0
1  2  11a  5.0  12.0  67.0
2  3  11b  6.0   NaN  23.0
→ Ссылка