Я использую панд для группировки определенных столбцов в кадре данных и применяю пользовательскую функцию к этим группам.Применяемая функция использует побочные эффекты и воздействует на глобальные объекты данных внутри функции.
Документированное предостережение с пандами, groupby и apply заключается в том, что по своей конструкции она применяет функцию, вызываемую дважды в первой группе, чтобы решить,это может занять быстрый или медленный путь кода.Это задокументировано здесь: http://pandas.pydata.org/pandas-docs/stable/groupby.html#flexible-apply
Показано здесь:
In [144]: d = pd.DataFrame({"a":["x", "y"], "b":[1,2]})
In [145]: def identity(df):
.....: print(df)
.....: return df
.....:
In [146]: d.groupby("a").apply(identity)
a b
0 x 1
a b
0 x 1
a b
1 y 2
Out[146]:
a b
0 x 1
1 y 2
Упоминается в нескольких других сообщениях stackoverflow здесь:
Python-метод применения группового объекта pandas дублирует первую группу
Является ли метод Pandas 0.16.1 groupby (). Apply () более одного раза, применяя функцию к одной и той же группе?
Упоминается на GitHub здесь:
https://github.com/pandas-dev/pandas/issues/7739
https://github.com/pandas-dev/pandas/issues/19167
Это означает, что мой побочный эффектвызывается дважды в первой группе и приводит к нежелательным изменениям.
Мой вопрос заключается в том, как мне использовать панд, групповые и применять без побочных эффектов, применяемых дважды в первой группе (или любой группе в этом отношении) и гарантировать, что он вызывается только один раз в каждой группе?
Я думал о создании фиктивной / фальшивой группы на вершине DataFrame, но я хотел расширить свой вопрос на сообщество stackoverflow для лучшего решения и в интересах других.
Спасибо за вашу помощь.
РЕДАКТИРОВАТЬ:
В соответствии с просьбой в комментариях, еще несколько деталей о пользовательских функциях и побочных эффектах.
Использованиепользовательской функции с побочными эффектами использует глобальный словарь в начале и конце функции.Он извлекает данные с помощью ключа и применяет эти значения к строкам. В конце функции обновленные значения обновляются в глобальном словаре, поэтому новые значения отражаются в следующей итерации.
Основная причина дляиспользование groupby с apply заключается в том, что это самое быстрое приложение, которое мне удалось найти при эффективной итерации объекта группового кадра.Я также рассмотрел простую итерацию и понимание списка.