web-dev-qa-db-fra.com

Trouver toutes les colonnes de la trame de données dans Pandas dont le type est float, ou un type particulier?

J'ai un dataframe, df, qui a quelques colonnes de type float64, tandis que les autres sont d'objet. En raison de la nature mixte, je ne peux pas utiliser

df.fillna('unknown') #getting error "ValueError: could not convert string to float:"

car l'erreur s'est produite avec les colonnes dont le type est float64 (quel message d'erreur trompeur!)

donc j'aimerais pouvoir faire quelque chose comme

for col in df.columns[<dtype == object>]:
    df[col] = df[col].fillna("unknown")

Donc, ma question est de savoir s'il existe une telle expression de filtre que je peux utiliser avec df.columns?

Je suppose alternativement, moins élégamment, je pourrais faire:

 for col in df.columns:
        if (df[col].dtype == dtype('O')): # for object type
            df[col] = df[col].fillna('') 
            # still puzzled, only empty string works as replacement, 'unknown' would not work for certain value leading to error of "ValueError: Error parsing datetime string "unknown" at position 0" 

Je voudrais également savoir pourquoi dans le code ci-dessus remplaçant '' par 'inconnu', le code fonctionnerait pour certaines cellules mais a échoué avec une cellule avec l'erreur "ValueError: Erreur lors de l'analyse de la chaîne datetime" inconnu "à la position 0"

Merci beaucoup!

Yu

34
Yu Shen

Vous pouvez voir quel est le dtype pour toutes les colonnes en utilisant l'attribut dtypes:

In [11]: df = pd.DataFrame([[1, 'a', 2.]])

In [12]: df
Out[12]: 
   0  1  2
0  1  a  2

In [13]: df.dtypes
Out[13]: 
0      int64
1     object
2    float64
dtype: object

In [14]: df.dtypes == object
Out[14]: 
0    False
1     True
2    False
dtype: bool

Pour accéder aux colonnes d'objets:

In [15]: df.loc[:, df.dtypes == object]
Out[15]: 
   1
0  a

Je pense que c'est plus explicite à utiliser (je ne suis pas sûr que inplace fonctionnerait ici):

In [16]: df.loc[:, df.dtypes == object] = df.loc[:, df.dtypes == object].fillna('')

Cela dit, je vous recommande d'utiliser NaN pour les données manquantes .

28
Andy Hayden

C'est concis:

# select the float columns
df_num = df.select_dtypes(include=[np.float])
# select non-numeric columns
df_num = df.select_dtypes(exclude=[np.number])
47
RNA