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

Pandas dataframe fillna() только некоторые столбцы на месте

Я пытаюсь заполнить никакие значения в фреймворке Pandas с 0 только для некоторого подмножества столбцов.

Когда я это сделаю:

import pandas as pd
df = pd.DataFrame(data={'a':[1,2,3,None],'b':[4,5,None,6],'c':[None,None,7,8]})
print df
df.fillna(value=0, inplace=True)
print df

Выход:

     a    b    c
0  1.0  4.0  NaN
1  2.0  5.0  NaN
2  3.0  NaN  7.0
3  NaN  6.0  8.0
     a    b    c
0  1.0  4.0  0.0
1  2.0  5.0  0.0
2  3.0  0.0  7.0
3  0.0  6.0  8.0

Он заменяет все None на 0. Я хочу только заменить None в столбцах a и b, но не c.

Каков наилучший способ сделать это?

4b9b3361

Ответ 1

Вы можете выбрать нужные столбцы и сделать это по назначению:

df[['a', 'b']] = df[['a','b']].fillna(value=0)

Полученный результат будет таким, как ожидалось:

     a    b    c
0  1.0  4.0  NaN
1  2.0  5.0  NaN
2  3.0  0.0  7.0
3  0.0  6.0  8.0

Ответ 2

Вы можете использовать dict, fillna с различным значением для разных столбцов

df.fillna({'a':0,'b':0})
Out[829]: 
     a    b    c
0  1.0  4.0  NaN
1  2.0  5.0  NaN
2  3.0  0.0  7.0
3  0.0  6.0  8.0

После назначения его

df=df.fillna({'a':0,'b':0})
df
Out[831]: 
     a    b    c
0  1.0  4.0  NaN
1  2.0  5.0  NaN
2  3.0  0.0  7.0
3  0.0  6.0  8.0

Ответ 3

Вы можете избежать копирования объекта с помощью решения Wen и inplace = True:

df.fillna({'a':0, 'b':0}, inplace=True)
print(df)

Который дает:

     a    b    c
0  1.0  4.0  NaN
1  2.0  5.0  NaN
2  3.0  0.0  7.0
3  0.0  6.0  8.0

Ответ 4

Или что-то вроде:

df.loc[df['a'].isnull(),'a']=0
df.loc[df['b'].isnull(),'b']=0

и если есть больше:

for i in your_list:
    df.loc[df[i].isnull(),i]=0

Ответ 5

используя верхний ответ, выдается предупреждение о внесении изменений в копию фрагмента df. Предполагая, что у вас есть другие столбцы, лучший способ сделать это - передать словарь:
df.fillna({'A': 'NA', 'B': 'NA'}, inplace=True)

Ответ 6

Здесь, как вы можете сделать все это в одной строке:

df[['a', 'b']].fillna(value=0, inplace=True)

Breakdown: df[['a', 'b']] выбирает столбцы, для которых вы хотите заполнить значения NaN, value=0 говорит ему, чтобы заполнить NaN с нулем, а inplace=True сделает изменения постоянными, не делая копия объекта.