Pandas сводная таблица с различными условиями в aggfunc - PullRequest
1 голос
/ 13 февраля 2020

Предположим, у меня есть my_df:

my_df = pd.DataFrame({'X': ['a', 'a', 'b', 'b'], 'Y1': [1, 2, 3, 4], 'Y2': [1, 2, 3, 4], 'Z': [1, 0, 1, 0]})

my_df
    X   Y1  Y2  Z
0   a   1   1   1
1   a   2   2   0
2   b   3   3   1
3   b   4   4   0

Я ищу способ использования pivot_table с возможно разными условиями для каждого столбца в aggfunc. В качестве примера предположим, что я хочу сгруппировать данные по X и получить среднее значение. Для Y1 я хотел бы применить прямое агрегирование mean, а для Y2 я хотел бы применить условное агрегирование mean для Z==1. Вывод в этом случае будет:

    Y1  Y2
X       
a   1.5 1
b   3.5 3

Как настроить следующий код для соответствия условию?

my_df.pivot_table(index = 'X', aggfunc={'Y1': 'mean', 'Y2': 'mean'})

Ответы [ 2 ]

1 голос
/ 13 февраля 2020

Не уверен, что это будет выполнимо с pivot_table, но я вижу способ сделать это с простым старым groupby

С groupby вы можете apply функцию, которая возвращает Series, который будет выведен в виде строки против индекса вашей группы.

my_df.groupby('X').apply(
    lambda x: pd.Series(
        {
            'Y1':x.Y1.mean(), 
            'Y2':x[x.Z==1].Y2.mean()
        }
    )
)

, который возвращает ожидаемый результат.

1 голос
/ 13 февраля 2020

Как настроить следующий код для соответствия условию?

Один из способов - mask столбец Y2 по Z, а затем поворот

(my_df.assign(Y2=my_df['Y2'].where(my_df['Z'].eq(1)))
      .pivot_table(index = 'X', aggfunc={'Y1': 'mean', 'Y2': 'mean'}))

    Y1   Y2
X          
a  1.5  1.0
b  3.5  3.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...