2017-10-20 9 views
2

D'abord, je l'ai faitQuand remplacer tous -1to np.NaN dans un pd.DataFrame de type int, int certains deviennent float

a = [[6,5,4,3,2],[1,2,3,4,5,6],[3,4,5,6]] 
b = pd.DataFrame(a) 
print(b.head(2)) 

La sortie est

1 2 3 4 5  6 
6 5 4 3 2.00 NaN 
1 2 3 4 5.00 6.00 
3 4 5 6 NaN NaN 

J'ai donc fait

a = [[6,5,4,3,2],[1,2,3,4,5,6],[3,4,5,6]] 
b = pd.DataFrame(a).fillna(-1).astype(int) 
print(b.head(2)) 

La sortie devient

1 2 3 4 5 6 
6 5 4 3 2 -1 
1 2 3 4 5 6 
3 4 5 6 -1 -1 

Mais je ne veux pas que ces -1, donc je l'ai fait

a = [[6,5,4,3,2],[1,2,3,4,5,6],[3,4,5,6]] 
b = pd.DataFrame(a).fillna(-1).astype(int) 
b = b.replace(-1, np.NaN) 
print(b.head(2)) 

La sortie est à nouveau identique à la première fois

1 2 3 4 5  6 
6 5 4 3 2.00 NaN 
1 2 3 4 5.00 6.00 
3 4 5 6 NaN NaN 
+0

Voir https://stackoverflow.com/questions/21287624/convert-pandas-column-containing-nans-to-dtype-int colonnes avec NaN ne peuvent pas être de type int. – Zero

+0

@Zero là * doit * être une meilleure cible dupe, mais je ne peux pas trouver un atm ... –

Répondre

2

Pour cette raison:

>>> type(np.nan) 
float 

Si vous avez NaN s dans votre colonne, le reste de votre colonne est automatiquement upcasté à float pour un calcul efficace.

Pour contourner cette difficulté, convertir le dtype-object, que je ne recommande pas à moins que c'est seulement pour affichage fins (vous tuer l'efficacité de cette façon).

m = b.dtypes == type(np.nan) 
b.loc[:, m] = b.loc[:, m].astype(object) 

print(b) 
    0 1 2 3 4 5 
0 6 5 4 3 2 NaN 
1 1 2 3 4 5 6 
2 3 4 5 6 NaN NaN 

print(b.dtypes) 
0  int64 
1  int64 
2  int64 
3  int64 
4 object 
5 object 
dtype: object