Включая отсутствующую комбинацию значений на основе группы сгруппированных данных

1

Я расширяю более раннюю тему: Включение отсутствующих комбинаций значений в агрегирование панд

В приведенной выше теме принятый ответ вычисляет все возможные комбинации для группирующей переменной. В этой версии я хотел бы вычислить комбинации на основе группы групп.

Давайте возьмем пример.

Вот входные данные кадра:

Изображение 174551

Здесь одной группой является [Year,Quarter] т.е.

Year  Quarter
2014  Q1
2015  Q2
2015  Q3

Другой набор группы - Name:

Name
Adam
Smith

Теперь я хочу применить groupby и sum, чтобы пропущенные значения комбинации вышеуказанных групп определялись как NaN

Вот пример вывода:

Изображение 174551

Буду признателен за любую помощь.


Вот пример 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}}

Разъяснение:

Я ищу метод, не делая расплав и бросить. т.е. без игры с длинным и широким форматом.

Теги:
pandas

2 ответа

1

Пример публикации, который вы опубликовали, является правильным ответом: 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
  • 0
    Спасибо, Крис. Интересно, что проблема в том, что метод 2 в этом потоке не работает. Я вижу, что метод 1 работает.
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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню