Значения с плавающей точкой при повороте целочисленного кадра данных (pandas - python) - PullRequest
0 голосов
/ 15 мая 2018

У меня огромный массив данных для панд в форме, подобной этому примеру:

 new_id hour names values
    0   0   mark    5
    0   0   matt    4
    0   0   alex    3
    1   0   roger   2
    1   0   arthur  7
    1   1   alf     8
    2   1   ale     6
    3   1   peter   5
    3   2   tom     2
    4   2   andrew  7

Мне нужно изменить его, поэтому я использую pivot_table():

dummy=dummy.pivot_table(index=['hour','new_id'],columns='name', values='values').fillna(0)

так становится

        names   ale alex alf andrew arthur mark matt peter roger tom
hour    new_id                                      
0           0   0.0 3.0 0.0 0.0 0.0 5.0 4.0 0.0 0.0 0.0
            1   0.0 0.0 0.0 0.0 7.0 0.0 0.0 0.0 2.0 0.0
1           1   0.0 0.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
            2   6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
            3   0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 0.0 0.0
2           3   0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0
            4   0.0 0.0 0.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0
....

Кстати, этот небольшой пример не может воспроизвести мою проблему: в реальном наборе данных, когда я его поворачиваю, я получаю некоторые значения с плавающей точкой, которых не должно быть, поскольку они являются агрегацией и суммой values исходного набора данных, которые являются целыми числами. Они не только плавают, но и далеки от точных результатов.

Почему я получаю эти значения с плавающей запятой? Есть ли лучший способ получить то, что я хочу? На самом деле я не хочу писать функцию для правильного суммирования всех значений перед поворотом кадра данных, поскольку это должно быть именно то, что делает pivot_table().

1 Ответ

0 голосов
/ 15 мая 2018

Существует проблема NaN s, которая преобразует все значения в float s, поэтому возможное решение - добавить параметр fill_value=0, если входные данные integer s:

dummy=dummy.pivot_table(index=['hour','new_id'],columns='name', values='values', fill_value=0)
print (dummy)
name         ale  alex  alf  andrew  arthur  mark  matt  peter  roger  tom
hour new_id                                                               
0    0         0     3    0       0       0     5     4      0      0    0
     1         0     0    0       0       7     0     0      0      2    0
1    1         0     0    8       0       0     0     0      0      0    0
     2         6     0    0       0       0     0     0      0      0    0
     3         0     0    0       0       0     0     0      5      0    0
2    3         0     0    0       0       0     0     0      0      0    2
     4         0     0    0       7       0     0     0      0      0    0

Агрегатная функция по умолчанию в pivot_table равна mean, поэтому ожидается, что в выводе будет хотя бы одно значение с плавающей запятой, поэтому она преобразует все значения в float с.

Так что если изменить агрегатную функцию на sum, все будет работать хорошо:

dummy = dummy.pivot_table(index=['hour','new_id'],
                          columns='name', 
                          values='values', 
                          fill_value=0, 
                          aggfunc='sum')
...