Попробуйте:
[{**x[i]} for i, x in df.stack().groupby(level=0)]
[{'A': 1.0, 'B': 1.0, 'D': 1.0, 'E': 1.0}, {'B': 2.0, 'C': 3.0, 'D': 4.0}]
Если вы хотите int
[{**x[i]} for i, x in df.stack().map(int).groupby(level=0)]
[{'A': 1, 'B': 1, 'D': 1, 'E': 1}, {'B': 2, 'C': 3, 'D': 4}]
Хакерский способ сохранить int
, если они int
[{**x[i]} for i, x in df.stack().fillna(0, downcast='infer').groupby(level=0)]
[{'A': 1, 'B': 1, 'D': 1, 'E': 1}, {'B': 2, 'C': 3, 'D': 4}]
Пояснение
# Series with a
# MultiIndex Make a Series and drop nulls
# ↓ ↓ ↓ Essentially grouping by `index` of `df`
[{**x[i]} for i, x in df.stack().groupby(level=0)]
# ↑ ↑
# ↑ Slice the MultiIndex with name of the group
# Unpack in a dictionary context with double splat `{**mydict} == mydict`