Оптимизировать в каждой группе Python

#python

#python

Вопрос:

Я попытался минимизировать стандартное отклонение столбца «V» для каждой группы. Итак, я использую scipy, код:

Это может привести к созданию нового массива «V», затем я попытался применить этот метод для каждой группы, используя:

 tt=df.groupby(by=["A","B"])
tt.minimize(equation,options={'xtol':0.001}).x
  

Однако, получите сообщение об ошибке

Объект ‘DataFrameGroupBy’ не имеет атрибута ‘minimize’

Может кто-нибудь дать мне несколько советов о том, как применить оптимизацию для каждой группы? Спасибо.

Комментарии:

1. у groupby нет функции минимизации, вы имеете в виду сжатие?

2. Я надеюсь минимизировать std для столбца «V» по группам. Я не знаю, какой модуль можно было бы использовать для решения этой проблемы. И мой метод работает только для всего фрейма данных. Я буду искать squeeze. Спасибо!

Ответ №1:

Используйте apply метод для запуска произвольных функций Python в каждой группе. minimize это функция в SciPy (не Pandas), и в вашем случае решение будет выглядеть примерно так:

 df.groupby(by=["A","B"])
  .apply(lambda g: minimize(equation, g.V, options={'xtol':0.001}).x)
  

Полный рабочий пример:

 >>> import pandas as pd
>>> from scipy.optimize import minimize, rosen
>>> df = pd.DataFrame({'A': list("abab"), 'B': list("cdcd"), 'V': [1, 2, 3, 4]})
>>> df.groupby(by=["A","B"]).apply(lambda g: minimize(rosen, g.V, options={'xtol':0.001}).x)
A  B
a  c    [0.9999955536845236, 0.9999911035369479]
b  d    [0.9999980290689747, 0.9999959871180912]
dtype: object
  

Комментарии:

1. Большое вам спасибо! это работает отлично. Что касается g.V, означает ли это V столбец в каждой группе? и лямбда g: выполняется ли итерация по группам? Правильно ли я понимаю?

2. lambda это синтаксис Python для быстрого создания функций. apply метод принимает любую функцию, первым аргументом которой является фрейм данных, и вызывает эту функцию и возвращает результат для каждой группы. Да, g это group / dataframe, и g.V ссылается на его столбец.

3. Имеет смысл. Спасибо за ваш любезный ответ!