Как объединить 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