Python 数据透视表将浮点转换为int

Python 数据透视表将浮点转换为int,python,pandas,dataframe,type-conversion,pivot-table,Python,Pandas,Dataframe,Type Conversion,Pivot Table,在将数据帧转换为透视表时,我发现了熊猫的奇怪行为 将熊猫作为pd导入 数据帧({'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:111111111111317.29,1:1111111112324.0,2:11112324.5}) table=df.pivot\u table(索引=['car

在将数据帧转换为透视表时,我发现了熊猫的奇怪行为

将熊猫作为pd导入
数据帧({'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:111111111111317.29,1:1111111112324.0,2:11112324.5})
table=df.pivot\u table(索引=['car\u id','car\u name','car\u order'],列=[],值=['car\u rank'],填充值='',dropna=True)
打印表
数据帧({'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})
表1=df1.pivot_表(索引=['car_id'、'car_name'、'car_order'],列=[],值=['car_rank'],填充值='',dropna=True)
打印表1
结果输出:

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中的值保持为float吗


熊猫0.18.0,python 2.7.9

以下是我对熊猫0.18.0的观察结果:

pandas/tools/pivot.py的源代码
pivot_table()的定义
line: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\u 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_表-你打算实现什么?

好的,这只是使用pivot表的示例,它取决于用户输入。调用pivot表之前更改了DF,比如DF=DF.fillna(value='',inplace=False,downcast=None),然后调用不带fillnaSo的pivot表
downcast='infer'
是否将其视为float32而不是float64?或者至少这似乎暗示了float32有大约7位精度,而df有问题,但不是df1。@JohnE,它将其降级为
int64
-请参阅我的更新答案-
类型。我注意到的是,fillna似乎“足够聪明”知道将df1向下转换到int64会丢失信息,但“不够聪明”知道df也会丢失信息。这与fillna将数字视为float32而不是float64大致一致,但我只是猜测这是原因。如果检查值的数据类型,您将看到int而不是float。