Сводная таблица Pandas с нулевыми значениями

#python #pandas #dataframe #pandas-groupby

#python #pandas #фрейм данных #pandas-groupby

Вопрос:

Я пытаюсь создать сводную таблицу с помощью .описание() из pandas python.

У меня есть следующий фрейм данных:

 df = pd.DataFrame({'Group':['Group1', 'Group1', 'Group1', 'Group2', 'Group2', 'Group2', 'Group3', 'Group3', 'Group4'],
'Cat':['Cat1', 'Cat2', 'Cat3', 'Cat4', 'Cat5', 'Cat', 'Cat7', 'Cat8', 'Cat9'],
'Value':[1230,4019,9491,9588,6402,1923,492,8589,8582]})
df

    Group   Cat Value
0   Group1  Cat1    1230
1   Group1  Cat2    4019
2   Group1  Cat3    9491
3   Group2  Cat4    9588
4   Group2  Cat5    6402
5   Group2  Cat     1923
6   Group3  Cat7    492
7   Group3  Cat8    8589
8   Group4  Cat9    8582
  

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

Я пытался с:

         df.groupby(['Group', 'Cat']).describe()

# That has the following output:
            Value
    count   mean    std min 25% 50% 75% max
    Group   Cat                             
    Group1  Cat1    1.0 1230.0  NaN 1230.0  1230.0  1230.0  1230.0  1230.0
            Cat2    1.0 4019.0  NaN 4019.0  4019.0  4019.0  4019.0  4019.0
            Cat3    1.0 9491.0  NaN 9491.0  9491.0  9491.0  9491.0  9491.0
    Group2  Cat     1.0 1923.0  NaN 1923.0  1923.0  1923.0  1923.0  1923.0
            Cat4    1.0 9588.0  NaN 9588.0  9588.0  9588.0  9588.0  9588.0
            Cat5    1.0 6402.0  NaN 6402.0  6402.0  6402.0  6402.0  6402.0
    Group3  Cat7    1.0 492.0   NaN 492.0   492.0   492.0   492.0   492.0
            Cat8    1.0 8589.0  NaN 8589.0  8589.0  8589.0  8589.0  8589.0
    Group4  Cat9    1.0 8582.0  NaN 8582.0  8582.0  8582.0  8582.0  8582.0
  

Но результат, который я хочу, это:

                 Value
    count   mean    std min 25% 50% 75% max
    Group   Cat                             
    Group1  Cat1    1.0 1230.0  NaN 1230.0  1230.0  1230.0  1230.0  1230.0
            Cat2    1.0 4019.0  NaN 4019.0  4019.0  4019.0  4019.0  4019.0
            Cat3    1.0 9491.0  NaN 9491.0  9491.0  9491.0  9491.0  9491.0
            Cat4    0.0 0.0     NaN 0.0     0.0     0.0     0.0     0.0
            Cat5    0.0 0.0     NaN 0.0     0.0     0.0     0.0     0.0
            Cat6    0.0 0.0     NaN 0.0     0.0     0.0     0.0     0.0
            Cat7    0.0 0.0     NaN 0.0     0.0     0.0     0.0     0.0
            Cat8    0.0 0.0     NaN 0.0     0.0     0.0     0.0     0.0
            Cat9    0.0 0.0     NaN 0.0     0.0     0.0     0.0     0.0
    Group2  Cat     1.0 1923.0  NaN 1923.0  1923.0  1923.0  1923.0  1923.0
            Cat1    0.0 0.0     NaN 0.0     0.0     0.0     0.0     0.0
            Cat2    0.0 0.0     NaN 0.0     0.0     0.0     0.0     0.0
            Cat3    0.0 0.0     NaN 0.0     0.0     0.0     0.0     0.0
            Cat4    1.0 9588.0  NaN 9588.0  9588.0  9588.0  9588.0  9588.0
            Cat5    1.0 6402.0  NaN 6402.0  6402.0  6402.0  6402.0  6402.0
            Cat6    0.0 0.0     NaN 0.0     0.0     0.0     0.0     0.0
            Cat7    0.0 0.0     NaN 0.0     0.0     0.0     0.0     0.0
            Cat8    0.0 0.0     NaN 0.0     0.0     0.0     0.0     0.0
            Cat9    0.0 0.0     NaN 0.0     0.0     0.0     0.0     0.0
    Group3  Cat1    0.0 0.0     NaN 0.0     0.0     0.0     0.0     0.0
            Cat2    0.0 0.0     NaN 0.0     0.0     0.0     0.0     0.0
            Cat3    0.0 0.0     NaN 0.0     0.0     0.0     0.0     0.0
            Cat4    0.0 0.0     NaN 0.0     0.0     0.0     0.0     0.0
            Cat5    0.0 0.0     NaN 0.0     0.0     0.0     0.0     0.0
            Cat6    0.0 0.0     NaN 0.0     0.0     0.0     0.0     0.0
            Cat7    1.0 492.0   NaN 492.0   492.0   492.0   492.0   492.0
            Cat8    1.0 8589.0  NaN 8589.0  8589.0  8589.0  8589.0  8589.0
            Cat9    0.0 0.0     NaN 0.0     0.0     0.0     0.0     0.0
    Group4  Cat1    0.0 0.0     NaN 0.0     0.0     0.0     0.0     0.0
            Cat2    0.0 0.0     NaN 0.0     0.0     0.0     0.0     0.0
            Cat3    0.0 0.0     NaN 0.0     0.0     0.0     0.0     0.0
            Cat4    0.0 0.0     NaN 0.0     0.0     0.0     0.0     0.0
            Cat5    0.0 0.0     NaN 0.0     0.0     0.0     0.0     0.0
            Cat6    0.0 0.0     NaN 0.0     0.0     0.0     0.0     0.0
            Cat7    0.0 0.0     NaN 0.0     0.0     0.0     0.0     0.0
            Cat8    0.0 0.0     NaN 0.0     0.0     0.0     0.0     0.0
            Cat9    1.0 8582.0  NaN 8582.0  8582.0  8582.0  8582.0  8582.0
  

Я хочу знать, как получить этот вывод.

Ответ №1:

Вы также можете создать список индексов декартовых произведений из полученного индекса и reindex :

 out = df.groupby(['Group', 'Cat']).describe()
idx = pd.MultiIndex.from_product((out.index.levels[0],out.index.levels[1]))
out = out.reindex(idx,fill_value=0)
  

             Value                                                     
            count    mean  std     min     25%     50%     75%     max
Group1 Cat    0.0     0.0  0.0     0.0     0.0     0.0     0.0     0.0
       Cat1   1.0  1230.0  NaN  1230.0  1230.0  1230.0  1230.0  1230.0
       Cat2   1.0  4019.0  NaN  4019.0  4019.0  4019.0  4019.0  4019.0
       Cat3   1.0  9491.0  NaN  9491.0  9491.0  9491.0  9491.0  9491.0
       Cat4   0.0     0.0  0.0     0.0     0.0     0.0     0.0     0.0
       Cat5   0.0     0.0  0.0     0.0     0.0     0.0     0.0     0.0
       Cat7   0.0     0.0  0.0     0.0     0.0     0.0     0.0     0.0
       Cat8   0.0     0.0  0.0     0.0     0.0     0.0     0.0     0.0
       Cat9   0.0     0.0  0.0     0.0     0.0     0.0     0.0     0.0
Group2 Cat    1.0  1923.0  NaN  1923.0  1923.0  1923.0  1923.0  1923.0
       Cat1   0.0     0.0  0.0     0.0     0.0     0.0     0.0     0.0
       Cat2   0.0     0.0  0.0     0.0     0.0     0.0     0.0     0.0
       Cat3   0.0     0.0  0.0     0.0     0.0     0.0     0.0     0.0
       Cat4   1.0  9588.0  NaN  9588.0  9588.0  9588.0  9588.0  9588.0
       Cat5   1.0  6402.0  NaN  6402.0  6402.0  6402.0  6402.0  6402.0
       Cat7   0.0     0.0  0.0     0.0     0.0     0.0     0.0     0.0
       Cat8   0.0     0.0  0.0     0.0     0.0     0.0     0.0     0.0
       Cat9   0.0     0.0  0.0     0.0     0.0     0.0     0.0     0.0
Group3 Cat    0.0     0.0  0.0     0.0     0.0     0.0     0.0     0.0
       Cat1   0.0     0.0  0.0     0.0     0.0     0.0     0.0     0.0
       ....................................
       ...............................
  

Ответ №2:

Проверьте с помощью unstack stack , обратите внимание, что я также рекомендую сохранить значение строки как NaN не заполненное на 0

 out = df.groupby(['Group', 'Cat']).describe().unstack().stack(dropna=False)