Панды: 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
Другие вопросы по тегам