Как определить функции агрегации pandas.groupby, когда некоторые столбцы агрегируются по «описанию», а другие - различными другими агрегаторами? - PullRequest
0 голосов
/ 21 мая 2019

Я пытаюсь обобщить данные от различных датчиков от процесса серийного производства, чтобы сопоставить их с конечным продуктом, используя функцию pandas.groupby (). Agg ({}).

Для удобства ипоскольку мы еще не уверены, как лучше всего суммировать некоторые атрибуты, я хочу использовать функцию «описать» для некоторых атрибутов.Для других атрибутов требуется несколько функций агрегирования, например ['min', 'max'].

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

Минимальный пример:

df = pd.DataFrame({'Sensor_1': [1, 2, 3, 4, 5, 6, 5, 4, 3, 3, 2], 
'Sensor_2': [2, 2, 3, 3, 7, 6, 9, 2, 2, 1, 1], 
'Batch': [1, 1, 1, 2, 1, 2, 1, 2, 2, 2, 2]})

Теперь я могу использовать оператор группировки для выполнения следующей группировки:

df.groupby('Batch').agg({'Sensor_1': 'mean',
                        'Sensor_2': 'describe'})

Я также могу группировать, например, как:

df.groupby('Batch').agg({'Sensor_1': ['mean', 'min'],
                        'Sensor_2': 'max'})

Однако такое определение, как:

df.groupby('Batch').agg({'Sensor_1': ['mean', 'min'],
                        'Sensor_2': 'describe'})

вызывает следующую ошибку:

TypeError: невозможно объединить объект типа "class 'dict'";действительны только объекты pd.Series, pd.DataFrame и pd.Panel (не рекомендуется)

Кто-нибудь знает, почему это происходит и как решить проблему?

IЯ использую Jupyter Hub с Python 3.6.8 и Pandas версии 0.23.0

1 Ответ

0 голосов
/ 21 мая 2019

То, что вы можете сделать, это, по сути, дать все функции метода describe, определив квантильную функцию

def quant(n):
    def quantile_(x):
        return np.quantile(x, n)
    quantile_.__name__ = 'quantile_%s' % n
    return quantile_

И затем просто:

df.groupby("Batch").agg({"Sensor_1": ['mean', 'min'], 
                         "Sensor_2": ['std', 'min', quant(.25), quant(.50), quant(.75), 'max']})

Надеюсь, это поможет:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...