Я расширяю более раннюю тему: Включение отсутствующих комбинаций значений в агрегирование панд
В приведенной выше теме принятый ответ вычисляет все возможные комбинации для группирующей переменной. В этой версии я хотел бы вычислить комбинации на основе группы групп.
Давайте возьмем пример.
Вот входные данные кадра:
Здесь одной группой является [Year,Quarter]
т.е.
Year Quarter
2014 Q1
2015 Q2
2015 Q3
Другой набор группы - Name
:
Name
Adam
Smith
Теперь я хочу применить groupby
и sum
, чтобы пропущенные значения комбинации вышеуказанных групп определялись как NaN
Вот пример вывода:
Буду признателен за любую помощь.
Вот пример input
и output
в формате dict
:
input=
{'Year': {0: 2014, 1: 2014, 2: 2015, 3: 2015, 4: 2015},
'Quarter': {0: 'Q1', 1: 'Q1', 2: 'Q2', 3: 'Q2', 4: 'Q3'},
'Name': {0: 'Adam', 1: 'Smith', 2: 'Adam', 3: 'Adam', 4: 'Smith'},
'Value': {0: 2, 1: 3, 2: 4, 3: 5, 4: 5}}
output=
{'Year': {0: 2014, 1: 2014, 2: 2015, 3: 2015, 4: 2015, 5: 2015},
'Quarter': {0: 'Q1', 1: 'Q1', 2: 'Q2', 3: 'Q2', 4: 'Q3', 5: 'Q3'},
'Name': {0: 'Adam', 1: 'Smith', 2: 'Adam', 3: 'Smith', 4: 'Smith', 5: 'Adam'},
'Value': {0: 2.0, 1: 3.0, 2: 9.0, 3: nan, 4: 5.0, 5: nan}}
Разъяснение:
Я ищу метод, не делая расплав и бросить. т.е. без игры с длинным и широким форматом.
Пример публикации, который вы опубликовали, является правильным ответом: groupby
получает sum
затем unstack
чтобы найти пропущенное значение, а затем stack
с параметром dropna=False
Здесь документы в стеке.
df.groupby(['Year','Quarter','Name']).sum().unstack().stack(dropna=False).reset_index()
Year Quarter Name Value
0 2014 Q1 Adam 2.0
1 2014 Q1 Smith 3.0
2 2015 Q2 Adam 9.0
3 2015 Q2 Smith NaN
4 2015 Q3 Adam NaN
5 2015 Q3 Smith 5.0
Используя pivot_table
, PS вы можете добавить reset_index
в конце
df.pivot_table(index=['Year','Quarter'],columns='Name',values='Value',aggfunc='sum').stack(dropna=False)
Year Quarter Name
2014 Q1 Adam 2.0
Smith 3.0
2015 Q2 Adam 9.0
Smith NaN
Q3 Adam NaN
Smith 5.0
dtype: float64