Найти все столбцы dataframe в Pandas, тип которых является float или конкретным типом?

У меня есть dataframe, df, который имеет несколько столбцов типа float64, а остальные - объекта. Из-за смешанного характера я не могу использовать

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

поскольку ошибка произошла с столбцами, тип которых является float64 (что является вводящим в заблуждение сообщением об ошибке!)

поэтому я бы хотел, чтобы я мог сделать что-то вроде

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

Итак, мой вопрос в том, есть ли такое выражение фильтра, которое я могу использовать с df.columns?

Я предполагаю, что альтернативно, менее элегантно, я мог бы сделать:

 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" 

Я также хотел бы знать, почему в приведенном выше коде, заменяющем "'на" неизвестный ", код будет работать для определенных ячеек, но не с ячейкой с ошибкой" ValueError: ошибка синтаксического анализа строки datetime "неизвестно" в позиции 0 "

Большое спасибо!

Ю.

Ответ 1

Вы можете видеть, что dtype для всех столбцов, используя атрибут 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

Чтобы получить доступ к столбцам объекта:

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

Я думаю, что он наиболее явный для использования (я не уверен, что inplace будет работать здесь):

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

Говоря это, я рекомендую использовать NaN для отсутствия данных.

Ответ 2

Это 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])