Подтвердить что ты не робот

Fillna в нескольких столбцах на месте в Python Pandas

У меня есть pandas dataFrame смешанных типов, некоторые - строки, а некоторые - числа. Я хотел бы заменить значения NAN в строковых столбцах на "." И значения NAN в столбцах float на 0.

Рассмотрим этот небольшой фиктивный пример:

df = pd.DataFrame({'Name':['Jack','Sue',pd.np.nan,'Bob','Alice','John'],
    'A': [1, 2.1, pd.np.nan, 4.7, 5.6, 6.8],
    'B': [.25, pd.np.nan, pd.np.nan, 4, 12.2, 14.4],
    'City':['Seattle','SF','LA','OC',pd.np.nan,pd.np.nan]})

Теперь я могу сделать это в 3 строках:

df['Name'].fillna('.',inplace=True)
df['City'].fillna('.',inplace=True)
df.fillna(0,inplace=True)

Так как это небольшой фрейм данных, 3 строки, вероятно, хорошо. В моем реальном примере (который я не могу поделиться здесь из-за причин конфиденциальности данных), у меня есть еще много строковых столбцов и числовых столбцов. Я в конечном итоге написал много строк только для fillna. Есть ли лаконичный способ сделать это?

4b9b3361

Ответ 1

Вы можете использовать apply для своих столбцов с проверкой dtype, будь то numeric или нет, проверив dtype.kind:

res = df.apply(lambda x: x.fillna(0) if x.dtype.kind in 'biufc' else x.fillna('.'))

print(res)
     A      B     City   Name
0  1.0   0.25  Seattle   Jack
1  2.1   0.00       SF    Sue
2  0.0   0.00       LA      .
3  4.7   4.00       OC    Bob
4  5.6  12.20        .  Alice
5  6.8  14.40        .   John

Ответ 2

Вы можете либо перечислить столбцы строк вручную, либо получить их из df.dtypes. Когда у вас есть список столбцов строки/объекта, вы можете вызвать fillna во всех этих столбцах сразу.

# str_cols = ['Name','City']
str_cols = df.columns[df.dtypes==object]
df[str_cols] = df[str_cols].fillna('.')
df.fillna(0,inplace=True)

Ответ 3

определить функцию:

def myfillna(series):
    if series.dtype is pd.np.dtype(float):
        return series.fillna(0)
    elif series.dtype is pd.np.dtype(object):
        return series.fillna('.')
    else:
        return series

вы можете добавить другие команды elif, если вы хотите каким-то другим способом заполнить столбец другого dtype. Теперь примените эту функцию ко всем столбцам блока данных

df = df.apply(myfillna)

это то же самое, что и "inplace"