#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)