Как выполнить расширенную группировку в пандах?Python

Программы на Python
Ответить
Anonymous
 Как выполнить расширенную группировку в пандах?

Сообщение Anonymous »

Самый простой способ — продемонстрировать мой вопрос на примере. Предположим, у меня есть следующий кадр данных длинного формата

Код: Выделить всё

In [284]: import pandas as pd

In [285]: data = pd.DataFrame({"day": [0,0,0,0,0,0,1,1,1,1,1,1], "cat1": ["A", "A", "A", "B", "B", "B", "A", "A", "B", "B", "B", "B"], "cat2":["1", "1", "2", "1", "2", "2", "1", "2", "1", "1", "2", "2"], "value": [10, 230, 32,12, 12, 65, 12, 34, 97, 0, 12,1]})

In [286]: data
Out[286]:
day cat1 cat2  value
0     0    A    1     10
1     0    A    1    230
2     0    A    2     32
3     0    B    1     12
4     0    B    2     12
5     0    B    2     65
6     1    A    1     12
7     1    A    2     34
8     1    B    1     97
9     1    B    1      0
10    1    B    2     12
11    1    B    2      1
В день у меня есть две категории. Моя цель — агрегировать категорию cat2 определенным образом. Для каждого кортежа (, cat1, cat2) Я хотел бы выполнить следующее:

Код: Выделить всё

In [287]: data_day = data[data["day"]==0]

In [288]: data_day_cat1 = data_day[data_day["cat1"]=="A"]

In [289]: data_day_cat1_cat2 = data_day_cat1[data_day_cat1["cat2"]=="1"]

In [290]: data_day_cat1_cat2["value"].pow(2).mean()
Out[290]: np.float64(26500.0)

In [291]: data_day_cat1_cat2 = data_day_cat1[data_day_cat1["cat2"]=="2"]

In [292]: data_day_cat1_cat2["value"].pow(2).mean()
Out[292]: np.float64(1024.0)
То есть в первый день, когда cat1 равен A, мне нужна одна строка для всех вхождений cat2, где последний как «среднеквадратическая ошибка». В настоящее время я перебираю все комбинации, но экспериментировал с использованием groupby. Однако что-то вроде:

Код: Выделить всё

data.groupby(["day", "cat1", "cat2"])["value"].apply(lambda x: x**2).mean()
Работает. Я хотел бы получить DataFrame (только первые две строки) следующим образом:

Код: Выделить всё

    day cat1 cat2  value
0     0    A    1  26500
1     0    A    2   1024
Возможно ли это без цикла по всему дню, cat1 и cat2? Можно ли использовать groupby?

Подробнее здесь: https://stackoverflow.com/questions/792 ... -in-pandas
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»