Панды: изменение структуры данных с повторяющимися записями - PullRequest
0 голосов
/ 10 июня 2018

У меня есть DF Pandas (краткий фрагмент ниже) с именем df

    deathtype    height    deaths
0   AMS           4900       1
1   AMS           5150       1
2   AMS           5300       1
3   Avalanche     5350       14
4   Avalanche     5600       4
5   Avalanche     5700       1
6   Avalanche     5800       17
7   Unexplained   8500       1
8   Unexplained   8560       1

Я пытаюсь преобразовать данные в следующее:

deaths         1                4          14       17
deathtype               
AMS           4900,5150,5300    0          0        0
Avalanche     5700              5600       5350     5800
Unexplained   8500, 8560        0          0        0

Я знаю, чтосводная таблица не может этого достичь, поскольку aggfunc использует среднее значение для дублированных значений, что означает, что для всех значений deaths, равных 1, будет записано среднее значение.Сводная таблица дает мне следующее:

df.pivot_table(index='deathtype', columns='deaths', values='height', fill_value='0')

deaths           1              4      14     17
deathtype               
AMS           5116.666667       0      0      0
Avalanche     5700.000000       5600   5350   5800
Unexplained   8530.000000       0      0      0

Я ищу несколько советов о том, как это сделать.Похоже, что сводная таблица не правильный подход здесь.Может кто-нибудь, пожалуйста, укажите несколько указателей.

1 Ответ

0 голосов
/ 10 июня 2018

Используйте groupby с агрегированием по join, затем измените форму на unstack:

d = lambda x: ', '.join(x.astype(str))
df = df.groupby(['deathtype', 'deaths'])['height'].agg(d).unstack(fill_value='0')
print (df)
deaths                     1     4     14    17
deathtype                                      
AMS          4900, 5150, 5300     0     0     0
Avalanche                5700  5600  5350  5800
Unexplained        8500, 8560     0     0     0

Сведения :

print (df.groupby(['deathtype', 'deaths'])['height'].agg(lambda x: ', '.join(x.astype(str))))
deathtype    deaths
AMS          1         4900, 5150, 5300
Avalanche    1                     5700
             4                     5600
             14                    5350
             17                    5800
Unexplained  1               8500, 8560
Name: height, dtype: object

Другое решение сpivot_table:

df = df.pivot_table(index='deathtype', 
                    columns='deaths', 
                    values='height', 
                    fill_value='0', 
                    aggfunc=lambda x: ', '.join(x.astype(str)))
...