Pandas pivot_table заменяет nan на 0 aggfunc = 'sum' - PullRequest
0 голосов
/ 04 ноября 2018

Я использую многозначную сводную таблицу этой формы:

pivot = df.pivot_table(index=[indices], columns=['column'], values=['start_value','end_value','delta','name','unit'], aggfunc='sum')

Фрейм данных df содержит столбцы ['start_value', 'end_value', 'delta', 'name', 'unit'] все объекта dtype. Это потому, что 'name' & 'unit' на самом деле являются строковыми столбцами, столбцами типа start_value, end_value и delta. Объект dtype - это попытка заставить pivot_table работать, даже если dtypes различны (по содержанию).

Когда одно значений не является значением nan, любое значение nan преобразуется в 0 вместо nan.

ДФ:

indices, column, 'start_value','end_value','delta','name','unit'
A,       '1nan',  nan,          1000,      nan,    'test', 'USD'
A,       'other', nan,          nan,       nan,    'test2', 'USD'

Результаты в сводной таблице:

indices, ('1nan', 'start_value'), ('1nan', 'end_value'), ('1nan', 'delta'),('1nan', 'name'), ('1nan', 'unit'), ('other', 'start_value'), ('other', 'end_value'), ('other', 'delta'), ('other', 'name'), ('other', 'unit')
A, 0 [should be nan], 1000, 0 [should be nan], 'test','USD', nan, nan, nan, 'test2', 'USD'

Любое предложение о том, как получить нанс вместо 0s?

1 Ответ

0 голосов
/ 04 ноября 2018

Альтернативным решением является использование GroupBy.sum с параметром min_count=1, но удалены не числовые столбцы :

df = (df.groupby(['indices', 'column'])
                ['start_value','end_value','delta','name','unit']
                 .sum(min_count=1) 
                  .unstack()
                    )
print (df)
        start_value         end_value          delta        
column       '1nan' 'other'    '1nan' 'other' '1nan' 'other'
indices                                                     
A               NaN     NaN    1000.0     NaN    NaN     NaN

потому что с pivot_table удалены столбцы NaNs:

df = df.pivot_table(index=['indices'], 
                    columns=['column'], 
                    values=['start_value','end_value','delta','name','unit'], 
                    aggfunc=lambda x: x.sum(min_count=1)
                    )
print (df)
        end_value    name            unit        
column     '1nan'  '1nan'  'other' '1nan' 'other'
indices                                          
A          1000.0  'test'  'test2'  'USD'   'USD'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...