Trouvez toutes les colonnes de dataframe dans les Pandas dont le type est float, ou un type particulier?

j'ai une base de données, 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:"

comme 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 s'il y a une expression de filtre que je peux utiliser avec df.les colonnes?

je suppose qu'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 aussi savoir pourquoi dans le code ci-dessus remplacer " par "unknown' le code fonctionnerait pour certaines cellules mais échouerait avec une cellule avec l'erreur de "ValueError: Error parsing DateTime string "unknown" à la position 0 "

Merci beaucoup!

Yu

30
demandé sur Yu Shen 2014-02-12 10:09:00

2 réponses

vous pouvez voir ce qu'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 objet:

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

je pense qu'il est le 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('')

en disant que, je vous recommande d'utiliser NaN pour les données manquantes .

23
répondu Andy Hayden 2017-05-23 10:30:57

ici conciser:

# select the float columns
df_num = df.select_dtypes(include=[np.float])
# select non-numeric columns
df_num = df.select_dtypes(exclude=[np.number])
35
répondu RNA 2015-06-09 18:34:13