Панды: drop_duplicates(). Fillna(0) не заполняет нули
Я пытаюсь отбросить дубликаты из серии, а затем заполнить NaN нулями. Должно быть довольно просто, но когда я объединяю две функции вместе, я все равно получаю NaN
где бы я ожидал 0.0
,
df = pd.DataFrame({'a':[1,1,2,3,3,4], 'b':[10,20,30,40,50,60]})
df['a'] = df['a'].drop_duplicates().fillna(0)
выходы:
a b
0 1.0 10
1 NaN 20
2 2.0 30
3 3.0 40
4 NaN 50
5 4.0 60
В то время как:
df['a'] = df['a'].drop_duplicates()
df['a'] = df['a'].fillna(0)
работает хорошо, но кажется излишне многословным.
Я на пандах 0.20.3.
2 ответа
Решение
Есть проблема после drop_duplicates
некоторые значения удаляются и выравнивание создают NaN
с ценностями. Так reindex
помогите здесь:
df['a'] = df['a'].drop_duplicates().reindex(df.index, fill_value=0)
print (df)
a b
0 1 10
1 0 20
2 2 30
3 3 40
4 0 50
5 4 60
Или использовать duplicated
с loc
:
df.loc[df['a'].duplicated(), 'a'] = 0
print (df)
a b
0 1 10
1 0 20
2 2 30
3 3 40
4 0 50
5 4 60
Так как drop_duplicates
удаляет элементы, ваш результат имеет меньший размер, чем фрейм данных, который вы назначаете обратно. Это вызывает несоответствие индекса.
В качестве альтернативы используйте mask
/where
с duplicated
-
df['a'] = df['a'].mask(df['a'].duplicated(), 0)
Или же,
df['a'] = df['a'].where(~df['a'].duplicated(), 0)
df
a b
0 1 10
1 0 20
2 2 30
3 3 40
4 0 50
5 4 60