2017-10-07 1 views
1

J'ai une trame de 8 colonnes et je voudrais convertir les six dernières colonnes en nombre entier. L'image contient également des valeurs NaN et je ne veux pas les supprimer.Python convertit des colonnes de données spécifiques en entier

enter image description here

 a  b c  d  e  f  g h 
0 john  1 NaN 2.0 2.0 42.0 3.0 NaN 
1 david 2 28.0 52.0 15.0 NaN 2.0 NaN 
2 kevin 3 1.0 NaN 1.0 10.0 1.0 5.0 

Toutes les idées?

Merci.

+0

savez-vous si les valeurs flottantes déjà présentes dans les colonnes peuvent être limitées dans un intervalle? Dire [0,100]? –

+0

oui c'est simple et bientôt vous avez une réponse: o –

Répondre

2

Merci à MaxU J'ajoute cette option avec nan = -1:

Raison: Les valeurs nan sont des valeurs flottantes et ne peuvent pas coexister avec des nombres entiers. Ainsi soit des valeurs nan et flotteurs ou la possibilité de penser à -1 comme nan

http://pandas.pydata.org/pandas-docs/version/0.20/generated/pandas.to_numeric.html

import pandas as pd 
import numpy as np 

df = pd.DataFrame.from_dict({'a': {0: 'john', 1: 'david', 2: 'kevin'}, 
'b': {0: 1, 1: 2, 2: 3}, 
'c': {0: np.nan, 1: 28.0, 2: 1.0}, 
'd': {0: 2.0, 1: 52.0, 2: np.nan}, 
'e': {0: 2.0, 1: 15.0, 2: 1.0}, 
'f': {0: 42.0, 1: np.nan, 2: 10.0}, 
'g': {0: 3.0, 1: 2.0, 2: 1.0}, 
'h': {0: np.nan, 1: np.nan, 2: 5.0}}) 

df.iloc[:, -6:] = df.iloc[:, -6:].fillna(-1) 
df.iloc[:, -6:] = df.iloc[:, -6:].apply(pd.to_numeric, downcast='integer') 

df 

    a b c d e f g h 
0 john 1 -1 2 2 42 3 -1 
1 david 2 28 52 15 -1 2 -1 
2 kevin 3 1 -1 1 10 1 5 
+0

Merci! Ça marche :) – Sheron

2

Merci @AntonvBR for the downcast='integer' hint:

In [29]: df.iloc[:, -6:] = df.iloc[:, -6:].apply(pd.to_numeric, errors='coerce', downcast='integer') 

In [30]: df 
Out[30]: 
     a b  c  d e  f g h 
0 john 1 NaN 2.0 2 42.0 3 NaN 
1 david 2 28.0 52.0 15 NaN 2 NaN 
2 kevin 3 1.0 NaN 1 10.0 1 5.0 

In [31]: df.dtypes 
Out[31]: 
a  object 
b  int64 
c float64 
d float64 
e  int8 
f float64 
g  int8 
h float64 
dtype: object 
+1

Hey! Il est impossible de commencer à penser à une solution avant que certains d'entre vous ne tapent quelque chose. Mais il veut ** entiers. ** downcast = 'entier'? –

+0

Oui, j'ai besoin d'un nombre entier ... ceci convertit pour flotter :) @AntonvBR – Sheron

+0

@Giada, les colonnes entières ne peuvent pas avoir de NaN, ainsi vous devez soit remplacer les NaN par une valeur entière, soit habiter avec des flottants ... – MaxU