Как правильно использовать Pandas Groupby с функцией применения для побочных эффектов?(Первая группа применяется дважды) - PullRequest
0 голосов
/ 09 октября 2018

Я использую панд для группировки определенных столбцов в кадре данных и применяю пользовательскую функцию к этим группам.Применяемая функция использует побочные эффекты и воздействует на глобальные объекты данных внутри функции.

Документированное предостережение с пандами, 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 заключается в том, что это самое быстрое приложение, которое мне удалось найти при эффективной итерации объекта группового кадра.Я также рассмотрел простую итерацию и понимание списка.

...