2016-01-21 4 views
13

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

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

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. Есть ли лаконичный способ сделать это?

+0

В вашем реальном примере для столбцов строки находятся «NaN» или строка «NaN»? – EdChum

+0

NaN, а не строка «NaN» – ozzy

ответ

10

Вы можете использовать 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 
+0

Это очень короткое и работает! благодаря – ozzy

5

Вы можете либо перечислить столбцы строк вручную, либо получить их от 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) 
+0

Это работает! Благодаря! – ozzy

1

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

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 

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

df = df.apply(myfillna) 

это то же самое, как «INPLACE»

+0

Это имеет смысл написать как функцию. Но не нужно ли нам писать это как 'для col в df.columns: df [col] = df.apply (myfillna)'? Функция возвращает серию, и мы заменяем весь файл данных этим. – ozzy

+0

нет, потому что по умолчанию apply имеет параметр axis = 0, что означает применение функции по каждому столбцу, а затем возвращает результат в виде кадра данных с новыми столбцами. – latorrefabian

+0

, так что фактически df.apply (myfillna) делает то, что вы предлагаете за кулисами. – latorrefabian

Смежные вопросы