Объединение столбцов с суммированием значений в ячейках по одинаковому значению столбца
Есть два датайрейма А и В. А:
P1 P2 P3
12 57 aa
23 23 bb
31 23 cc
46 12 dd
B:
P1 P4 P3
23 NaN bb
56 23 aa
63 34 aa
10 29 cc
Нужно объединить их по столбцу P3 так, чтобы в самом столбце Р3 не было дублирующихся значений. В случае, если в датафреймах А и В есть строка с одним и тем же значением в столбце Р3, то значения в других столбцах с одинаковым названием должны суммироваться. Я использую код:
C = pd.concat([A, B], sort = True)
он дает результат
P1 P2 P3 P4
12 57 aa NaN
23 23 bb NaN
31 23 cc NaN
46 12 dd NaN
23 NaN bb NaN
56 NaN aa 23
63 NaN aa 34
10 NaN cc 29
Желаемый результат:
P1 P2 P3 P4
131 57 aa 57
46 23 bb NaN
41 23 cc 29
46 12 dd NaN
Ответы (1 шт):
Автор решения: strawdog
→ Ссылка
Попробуйте сделать так:
res = pd.concat([df1, df2]).groupby("P3").sum(min_count=1).reset_index()
# min_count в аггрегаторе нужен, чтобы NaN возвращались как NaN, иначевы вместо них
# получите нули.
res:
P3 P1 P2 P4
0 aa 131 57.0 57.0
1 bb 46 23.0 NaN
2 cc 41 23.0 29.0
3 dd 46 12.0 NaN
Можно еще сделать то же самое с приведением типов:
res = pd.concat([df1, df2]).groupby("P3").sum(min_count=1).reset_index().convert_dtypes()
res:
P3 P1 P2 P4
0 aa 131 57 57
1 bb 46 23 <NA>
2 cc 41 23 29
3 dd 46 12 <NA>
если добавить
res = res.reindex(sorted(res.columns), axis=1)
то получите исходную сортировку фрейма лексиграфически по именам колонок:
P1 P2 P3 P4
0 131 57 aa 57
1 46 23 bb <NA>
2 41 23 cc 29
3 46 12 dd <NA>