2017-10-21 15 views
1

Après créer une nouvelle trame de données avec pandas géants pivot_table, les changements de DTYPE de int32 flotterpandas change pivot DTYPE

dataframe originale

df = pd.DataFrame.from_dict(my_dict, orient='columns', dtype='i4') 
print(df.head(11)) 

sortie:

  clock eventid   ns objectid value 
0 1505960158 62704261 327504323  32219  1 
1 1505962773 62711138 22192905  32219  0 
2 1505400465 61216428 123915259  32233  1 
3 1504642494 59208977 369082011  32254  1 
4 1504643325 59210478 576875730  32254  0 
5 1504642494 59208978 369082011  32260  1 
6 1504643325 59210479 576875730  32260  0 
7 1504224224 58101461 445846619  13479  0 
8 1504258784 58187457 204908064  13479  1 
9 1504310624 58318750 443786274  13479  0 
10 1504517992 58886060 746243067  13479  1 

print(df.dtypes) 

sortie:

clock  int32 
eventid  int32 
ns   int32 
objectid int32 
value  int32 
dtype: object 

Whe J'utilise pivot_table

p = df.reset_index().pivot_table(index="objectid", columns="value", values="clock", fill_value=0).iloc[:, ::-1] 
print(p) 

sortie:

value    1    0 
objectid       
13479  1505534184 1.505467e+09 
13485  1505676014 1.505677e+09 
32219  1505960158 1.505963e+09 
32233  1505400465 0.000000e+00 
32254  1504642494 1.504643e+09 
32260  1504642494 1.504643e+09 
print(p.dtypes) 

sortie:

value 
1  int64 
0 float64 
dtype: object 

Pourquoi colonne devenir flottant? Comment éviter cela?

Répondre

1

Vos données d'échantillon ne peuvent le montrer, mais les résultats de votre opération de pivot peut contenir NaN s, qui sont de type float, de sorte que le reste de la colonne est également upcasted à float automatiquement par pandas géants pour le calcul efficace. Notez que les NaN s sont remplis par des zéros (fill_value=0), donc vous ne pouvez pas les voir.

Par exemple, il n'y a pas de ligne avec objectid = 32233 et value = 0, de sorte que l'entrée correspondante dans le résultat de pivot apparaît comme NaN, qui est ensuite rempli de 0.

Maintenant qu'il est clair pourquoi les colonnes sont upcasted, vous pouvez réinitialiser le type de données à l'aide astype:

p = p.astype(int) 
+0

Il n'y a pas NAN. Le dataframe df a 133 lignes mais le p dataframe n'en a que 6. Je vais éditer ma question. –

+0

@JoaoVitorino Do 'df.isnull(). Any()' et s'il vous plaît voir ce que les sorties. Un de vos résultats a un '0.0000000e + 00' donc c'est un peu indicatif. –

+0

df.isnull(). Any() renvoie false pour toutes les colonnes –