2016-03-31 17 views
3

データフレームをピボットテーブルに変換するときにパンダの動作が奇妙になりました。Pandas Pivotテーブルが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値はfloatとして滞在しますか?

ソースコードpivot_table()行のpandas/tools/pivot.py定義:141-142:

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

パンダ0.18.0、ここでのpython 2.7.9

+0

dtypesの値をチェックすると、floatではなくintが表示されます。 – jurkij

答えて

4

pandas 0.18.0の私の観察の結果であり、これはまさにあなたのピボットした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()を使用している場合(すなわち、ピボット用) - それは正常に動作します:あなたがその奇妙な方法で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は、私はまだ理解できない - あなたは何を達成しようとしていますか?

+0

これはピボットテーブルを使用したサンプルに過ぎず、ユーザーの入力によって異なります。ピボットテーブルを呼び出す前に** df = df.fillna(value = ''、inplace = False、downcast = None)**のようにDFを変更してからfillnaなしでピボットテーブルを呼び出す – jurkij

+0

'downcast = 'infer''はfloat32 float64の代わりに?フロート32には7桁の精度があり、dfには問題はありますがdf1はないことを考えると、少なくとも暗黙のようです。 – JohnE

+0

@ JohnE、それは 'int64'にダウンキャストされました - 私の更新された答えを見てください - ' Types' – MaxU

関連する問題