Сводная таблица Pandas преобразует float в int

Я обнаружил странное поведение панд при преобразовании фрейма данных в сводную таблицу.

import pandas as pd
df = pd.DataFrame({'car_id': {0: 'Trabant', 1: 'Buick', 2: 'Dodge'}, 'car_order': {0: 2, 1: 1, 2: 14}, 'car_name': {0: 'Trabant', 1: 'Buick', 2: 'Dodge'}, 'car_rank': {0: 111111317.29, 1: 1111112324.0, 2: 1111112324.5}})
table = df.pivot_table(index=['car_id', 'car_name', 'car_order'], columns=[],values=['car_rank'], fill_value='',dropna=True)
print table

df1 = pd.DataFrame({'car_id': {0: 'Trabant', 1: 'Buick', 2: 'Dodge'}, 'car_order': {0: 2, 1: 1, 2: 14}, 'car_name': {0: 'Trabant', 1: 'Buick', 2: 'Dodge'}, 'car_rank': {0: 17.29, 1: 24.0, 2: 24.5}})
table1 = df1.pivot_table(index=['car_id', 'car_name', 'car_order'], columns=[],values=['car_rank'], fill_value='',dropna=True)
print table1

Результат вывода:

Table
                              car_rank
car_id  car_name car_order            
Buick   Buick    1          1111112324
Dodge   Dodge    14         1111112324
Trabant Trabant  2           111111317

Table 1
                            car_rank
car_id  car_name car_order          
Buick   Buick    1             24.00
Dodge   Dodge    14            24.50
Trabant Trabant  2             17.29

Знаете ли вы, почему значения в таблице преобразуются в int, а значения в таблице 1 остаются с плавающей точкой?

панды 0.18.0, питон 2.7.9


person jurkij    schedule 31.03.2016    source источник
comment
Если вы проверите dtypes значений, вы увидите int вместо float.   -  person jurkij    schedule 31.03.2016


Ответы (1)


вот результат моих наблюдений за pandas 0.18.0:

Исходный код pandas/tools/pivot.py определения pivot_table() строк: 141-142:

if fill_value is not None:
    table = table.fillna(value=fill_value, downcast='infer')

Это именно то, что случилось с вашим повернутым DF:

In [78]: df.fillna('', downcast='infer')
Out[78]:
    car_id car_name  car_order    car_rank
0  Trabant  Trabant          2   111111317
1    Buick    Buick          1  1111112324
2    Dodge    Dodge         14  1111112324

Типы:

In [48]: df.fillna('', downcast='infer').dtypes
Out[48]:
car_id       object
car_name     object
car_order     int64
car_rank      int64
dtype: object

Интересно, что если вы правильно используете pivot_table() (т.е. для поворота), он работает правильно:

In [81]: df.pivot_table(index=['car_id', 'car_order'], columns=['car_name'], values=['car_rank'],dropna=True, fill_value='')
Out[81]:
                       car_rank
car_name                  Buick         Dodge      Trabant
car_id  car_order
Buick   1         1111112324.00
Dodge   14                      1111112324.50
Trabant 2                                     111111317.29

PS Я до сих пор не могу понять, почему вы так странно используете pivot_table - чего вы собираетесь достичь?

person MaxU    schedule 31.03.2016
comment
Хорошо, это был всего лишь пример использования сводной таблицы, это зависит от ввода пользователя. Перед вызовом сводной таблицы изменил DF как df = df.fillna (value = '', inplace = False, downcast = None), а затем вызвал сводную таблицу без заполнения - person jurkij; 31.03.2016
comment
Итак, downcast='infer' рассматривается как float32 вместо float64? Или, по крайней мере, это кажется подразумеваемым, учитывая, что float32 имеет около 7 цифр точности, а df имеет проблему, но не df1. - person JohnE; 31.03.2016
comment
@JohnE, он снизил его до int64 - см. Мой обновленный ответ - Types - person MaxU; 31.03.2016
comment
Точно. Я отмечаю, что fillna кажется достаточно умен, чтобы знать, что преобразование df1 в int64 приведет к потере информации, но недостаточно умен, чтобы знать то же самое для df. Это примерно соответствует тому, что fillna рассматривает числа как float32, а не как float64, но я просто размышляю о том, что является причиной. - person JohnE; 31.03.2016