Я пытаюсь заполнить никакие значения в кадре данных 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
's. Я хочу только заменить None
s в столбцах a
и b
, но не c
.
Как лучше всего это сделать?
df[['a', 'b']] = df[['a','b']].fillna(value=0)
inplace
прежнему будет работать с копией. Не знаю, так этоfillna
или нет. Посмотрите этот ответ от одного из разработчиков ядра pandas.Вы можете с помощью
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
источник
fromkeys
если хотите, +1df.fillna({'a':0,'b':0}, inplace=True)
Вы можете избежать копирования объекта, используя решение Вена и 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
источник
использование верхнего ответа вызывает предупреждение о внесении изменений в копию фрагмента df. Предполагая, что у вас есть другие столбцы, лучший способ сделать это - передать словарь:
df.fillna({'A': 'NA', 'B': 'NA'}, inplace=True)
источник
Вот как можно сделать все в одной строке:
df[['a', 'b']].fillna(value=0, inplace=True)
Разбивка:
df[['a', 'b']]
выбирает столбцы, для которых вы хотите заполнить значения NaN,value=0
сообщает ему заполнить NaN нулями иinplace=True
делает изменения постоянными, без необходимости делать копию объекта.источник
df
.Или что-то вроде:
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
источник
Иногда этот синтаксис не работает:
df[['col1','col2']] = df[['col1','col2']].fillna()
Вместо этого используйте следующее:
df['col1','col2']
источник