Я думаю, что вместо использования select_dtypes
и итерации по столбцам вы можете взять .dtypes
вашего DF и заменить на float64 wth 0.0 и объекты на "NULL" ... вам не нужно беспокоиться о int64, так как обычно у них не будет пропущенных значений для заполнения (если вы не используете pd.NA
или тип int с нулевым значением), поэтому вы можете выполнить одну операцию:
df.fillna(df.dtypes.replace({'float64': 0.0, 'O': 'NULL'}), inplace=True)
Вы также можете добавьте downcast='infer'
, чтобы, если у вас есть то, что может быть int64
с в столбце float64
, вы получите int64
с, например, с учетом:
df = pd.DataFrame({
'a': [1.0, 2, np.nan, 4],
'b': [np.nan, 'hello', np.nan, 'blah'],
'c': [1.1, 1.2, 1.3, np.nan]
})
Тогда:
df.fillna(df.dtypes.replace({'float64': 0.0, 'O': 'NULL'}), downcast='infer', inplace=True)
Даст вам (примечание, столбец a
был понижен до int, но c
остается плавающим):
a b c
0 1 NULL 1.1
1 2 hello 1.2
2 0 NULL 1.3
3 4 blah 0.0