pivot_table () для df нет числовых типов для агрегирования - PullRequest
0 голосов
/ 01 марта 2019

У меня есть df, который я пытаюсь денормализовать.По сути, я хочу изменить значения параметров, такие как 'inst-cap-c', 'cap-lo-c' и т. Д. ... на столбцы.

Для того, чтобы сделать это, в pandas lib до сих пор было 2 метода.С обоими из них я столкнулся с некоторыми проблемами и не смог денормализовать этот df ...

df выглядит следующим образом (для простоты используется ...):

data       
   Site  Storage Commodity     parameter    value
0  Mid   Pump    Elec         inst-cap-c        0
1  Mid   Pump    Elec           cap-lo-c        0
2  Mid   Pump    Elec           cap-up-c  1.5e+15
3  Mid   Pump    Elec         inst-cap-p        0
4  Mid   Pump    Elec           cap-lo-p        0
...
52 South Pump    Elec               wacc     0.07
53 South Pump    Elec       depreciation       50
54 South Pump    Elec               init        1
55 South Pump    Elec          discharge  3.5e-06
56 South Pump    Elec           ep-ratio     None

Когда я пытаюсьСоздайте столбцы со значениями параметров через:

data.pivot_table(values='value',
                 index=['Site', 'Storage', 'Commodity'],
                 columns='parameter')

, это просто говорит: *** pandas.core.base.DataError: No numeric types to aggregate

Я предполагаю, что это потому, что None значение ep-ratio, я не могу использовать NaN сверх None, потому что это создало другие проблемы.

Так как я могу денормализовать этот фрейм данных?

Ожидаемый результат:

data       
   Site    Storage  Commodity  inst-cap-c  cap-lo-c cap-up-c ... ep-ratio
0  Mid     Pump     Elec                0         0  1.5e+15 ...     None
1  North   Pump     Elec                0         0  1.5e+15 ...     None
2  South   Pump     Elec                0         0  1.5e+15 ...     None

Дополнительно:

data.set_index(['Site', 'Storage','Commodity'], append=True).unstack('parameter')
*** KeyError: 'Level parameter not found'

Я также проверил это: pivot_table Нет числовых типов для агрегирования это не помогает

1 Ответ

0 голосов
/ 02 марта 2019

Вы близки, вам нужно parameter добавить столбец в список, выбрать столбец value до unstack и последнее использование reset_index с rename_axis для очистки данных:

df = (data.set_index(['Site', 'Storage','Commodity','parameter'])['value']
          .unstack()
          .reset_index()
          .rename_axis(None, axis=1))
print (df)
    Site Storage Commodity cap-lo-c cap-lo-p cap-up-c depreciation discharge  \
0    Mid    Pump      Elec        0        0  1.5e+15          NaN       NaN   
1  South    Pump      Elec      NaN      NaN      NaN           50   3.5e-06   

  ep-ratio init inst-cap-c inst-cap-p  wacc  
0      NaN  NaN          0          0   NaN  
1     None    1        NaN        NaN  0.07  
...