Pandas透视表将浮点数转换为整数

5
我发现pandas在将数据框转换为透视表时出现了奇怪的行为。
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

你知道为什么在表格中的值会被转换为整数,而在表格1中的值保持为浮点数吗?

pandas 0.18.0,python 2.7.9


如果您检查值的数据类型,您会看到 int 而不是 float。 - jurkij
1个回答

6

下面是我对 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')

这正是你的透视数据框所发生的事情:
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 - 你想达到什么目的?


好的,这只是使用数据透视表的示例,它取决于用户输入。在调用数据透视表之前,需要像 df = df.fillna(value='', inplace=False, downcast=None) 这样更改 DF,然后调用数据透视表而不使用 fillna。 - jurkij
那么 downcast='infer' 是被视为 float32 而不是 float64 吗?或者至少这似乎是暗示的,因为 float32 大约有 7 位数字的精度,而 df 存在问题,但 df1 没有。 - JohnE
@JohnE,它将其向下转换为“int64” - 请参阅我的更新答案 - “类型” - MaxU - stand with Ukraine
没错。我的意思是fillna似乎“聪明到足以知道”将df1下转换为int64会丢失信息,但不够“聪明”以同样的方式处理df。这大致符合fillna将数字视为float32而不是float64的情况,但我只是在猜测它可能是原因。 - JohnE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接