Define aggfunc для каждого столбца значений в сводной таблице pandas

пытался создать сводную таблицу с несколькими столбцами "значения". Я знаю, что могу использовать aggfunc для агрегирования значений так, как я хочу, но что, если я не хочу суммировать или объявлять оба столбца, но вместо этого я хочу, чтобы сумма одного столбца была равна среднему значению другого. Так можно сделать это с помощью pandas?

df = pd.DataFrame({
          'A' : ['one', 'one', 'two', 'three'] * 6,
          'B' : ['A', 'B', 'C'] * 8,
          'C' : ['foo', 'foo', 'foo', 'bar', 'bar', 'bar'] * 4,
          'D' : np.random.randn(24),
          'E' : np.random.randn(24)
})

Теперь это получит сводную таблицу с суммой:

pd.pivot_table(df, values=['D','E'], rows=['B'], aggfunc=np.sum)

И это для среднего:

pd.pivot_table(df, values=['D','E'], rows=['B'], aggfunc=np.mean)

Как я могу получить сумму для D и значение для E?

Надеюсь, мой вопрос достаточно ясен.

Ответы

Ответ 1

Вы можете выполнить два DataFrames:

>>> df1 = pd.pivot_table(df, values=['D'], rows=['B'], aggfunc=np.sum)
>>> df2 = pd.pivot_table(df, values=['E'], rows=['B'], aggfunc=np.mean)
>>> pd.concat((df1, df2), axis=1)
          D         E
B                    
A  1.810847 -0.524178
B  2.762190 -0.443031
C  0.867519  0.078460

или вы можете передать список функций как aggfunc, а затем переиндексировать:

>>> df3 = pd.pivot_table(df, values=['D','E'], rows=['B'], aggfunc=[np.sum, np.mean])
>>> df3
        sum                mean          
          D         E         D         E
B                                        
A  1.810847 -4.193425  0.226356 -0.524178
B  2.762190 -3.544245  0.345274 -0.443031
C  0.867519  0.627677  0.108440  0.078460
>>> df3 = df3.ix[:, [('sum', 'D'), ('mean','E')]]
>>> df3.columns = ['D', 'E']
>>> df3
          D         E
B                    
A  1.810847 -0.524178
B  2.762190 -0.443031
C  0.867519  0.078460

Alghouth, было бы неплохо иметь возможность определять aggfunc для каждого столбца отдельно. Не знаю, как это можно сделать, может быть передано в aggfunc dict-like параметр, например {'D':np.mean, 'E':np.sum}.

update На самом деле, в вашем случае вы можете поворачиваться вручную:

>>> df.groupby('B').aggregate({'D':np.sum, 'E':np.mean})
          E         D
B                    
A -0.524178  1.810847
B -0.443031  2.762190
C  0.078460  0.867519

Ответ 2

Вы можете применить определенную функцию к определенному столбцу, передав в dict.

pd.pivot_table(df, values=['D','E'], rows=['B'], aggfunc={'D':np.sum, 'E':np.mean})

Ответ 3

table = pivot_table(df, values=['D', 'E'], index=['A', 'C'],
                aggfunc={'D': np.mean,'E': np.sum})

таблица DE средняя сумма AC bar большая 5.500000 7.500000 маленькая 5.500000 8.500000 foo большая 2.000000 4.500000 малая 2.333333 4.333333