Просматривая вопрос о SO и моделируя ответ, я обнаружил странное поведение между версией Pandas 0.21.0
При использовании fillna
вместе с sum()
для столбцов он работает по желанию. Однако результат 0.0
выше версии 0.21.0
.
Структура DataFrame:
>>> df = pd.DataFrame({'PlaceTest':[21,21,22,22], 'Approved':[1,0,1,0]})
>>> df
PlaceTest Approved
0 21 1
1 21 0
2 22 1
3 22 0
Создание нового столбца с помощью groupby
при использовании sum()
..
>>> df['Not Approved'] = df.groupby('PlaceTest')['Approved'].sum()
>>> df
PlaceTest Approved Not Approved
0 21 1 NaN
1 21 0 NaN
2 22 1 NaN
3 22 0 NaN
Теперь, используя версию 0.21.0
он получает желаемый результат следующим образом:
>>> df = df.groupby('PlaceTest')['Approved', 'Not Approved'].sum().fillna("1").reset_index()
>>> df
PlaceTest Approved Not Approved
0 21 1 1
1 22 1 1
Однако при использовании такого же подхода с версией 0.23.3
.
>>> df.groupby('PlaceTest')['Approved', 'Not Approved'].sum().fillna("1").reset_index()
PlaceTest Approved Not Approved
0 21 1 0.0
1 22 1 0.0
Есть ли какое-либо изменение функциональности над большей версией панд при использовании sum()
вместе с методом fillna
?
Поблагодарите любые комментарии экспертов по этому поводу, возможно, они есть, но, похоже, сейчас на моей голове.
Здесь идет справочный вопрос
Per What New в Pandas v0.22.0 (мой акцент):
Pandas 0.22.0 изменяет обработку пустых и все-NA сумм и продуктов. Резюме состоит в том, что
- Сумма пустой или все-NA-серии теперь равна 0
- Произведение пустой или все-NA серии теперь 1
Некоторая предыстория: в pandas 0.21 мы зафиксировали давнюю несогласованность в возвращаемом значении серии all-NA в зависимости от того, было ли установлено узкое место. См. Sum/Prod из всех NaN или пустой серии /DataFrames теперь последовательно NaN. В то же время мы изменили сумму и произведение пустой серии, также являющейся NaN. В v0.21.0 сумма пустой или все-NA-серии была NaN.
Так в версии 2.0.2.0 или новее:
In [16]: df.groupby('PlaceTest')['Approved', 'Not Approved'].sum()
Out[16]:
Approved Not Approved
PlaceTest
21 1 0.0
22 1 0.0
тогда как в v0.21.0:
In [16]: df.groupby('PlaceTest')['Approved', 'Not Approved'].sum()
Out[16]:
Approved Not Approved
PlaceTest
21 1 NaN
22 1 NaN
Таким образом, в первом случае fillna("1")
ничего не делает, поскольку NaN не заполняются.