2016-03-31 16 views
3

Pandalar Pivot tablo, veri çerçevesini pivot tabloya dönüştürürken pandaların garip davranışını buldum.

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 

Sonuç çıkışı:

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 

neden Tablo değerler int türüne dönüştürülür biliyor musunuz ve Tablo 1 değerler float olarak kalmak?

Kaynak kod pivot_table() hatlarının pandas/tools/pivot.py tanımının: 141-142:

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

pandalar 0.18.0, burada piton 2.7.9

+0

Değerlerin degerlerini kontrol ederseniz, float yerine int görürsünüz. – jurkij

cevap

4

pandas 0.18.0 benim gözlemlerin sonucudur Bu tam olarak sizin 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 
'ınıza ne oldu?

Türleri: İlginçtir ki

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

- düzgün pivot_table() kullanırsanız (yani döndürmek için) - bu düzgün çalışır:

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 hala neden böyle garip bir şekilde pivot_table kullanıyorsunuz anlayamıyorum - elde etmek yapacaksın?

+0

Tamam, bu sadece pivot tablo kullanma örneğiydi, kullanıcı girişine bağlı. Pivot tablo çağrılmadan önce DF gibi df = df.fillna (değer = '', inplace = False, downcast = Yok) ** ve sonra fillna olmadan pivot tabloyu arayın – jurkij

+0

Yani 'downcast = 'infer'' float32 olarak davranıyor float64 yerine mi? Ya da en azından bu float32 yaklaşık 7 basamaklı bir hassasiyete sahip olduğu ve df'nin problemi olduğu düşünüldüğünde ima edilmiş gibi görünüyor df1. – JohnE

+0

@JohnE, bunu "int64" e indirdi - güncellenmiş cevabımı gör - Türler – MaxU