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
.
Каков наилучший способ сделать это?
Ответы
Ответ 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
сделает изменения постоянными, не делая копия объекта.