pandas.pivot_table:如何命名函数以进行聚合

时间:2018-10-18 09:00:45

标签: python pandas lambda pivot-table

我正在尝试使用多个聚合函数(其中一些是lambda)来透视pandas DataFrame。每个列必须有一个唯一的名称,以便具有多个lambda函数的聚合。我尝试了一些在网上找到的想法,但没有一个奏效。这是最小的示例:

df = pd.DataFrame({'col1': [1, 1, 2, 3], 'col2': [4, 4, 5, 6], 'col3': [7, 10, 8, 9]})

pivoted_df = df.pivot_table(index = ['col1', 'col2'], values  = 'col3', aggfunc=[('lam1', lambda x: np.percentile(x, 50)), ('lam2', np.percentile(x, 75)]).reset_index()

错误是

AttributeError: 'SeriesGroupBy' object has no attribute 'lam1'

我尝试使用dictionary,它也会导致错误。有人可以帮忙吗?谢谢!

2 个答案:

答案 0 :(得分:2)

显式命名函数:

def lam1(x):
    return np.percentile(x, 50)

def lam2(x):
    return np.percentile(x, 75)

pivoted_df = df.pivot_table(index = ['col1', 'col2'], values  = 'col3',
                            aggfunc=[lam1, lam2]).reset_index()

您的汇总系列将被适当命名:

print(pivoted_df)

   col1  col2  lam1  lam2
0     1     4   8.5  9.25
1     2     5   8.0  8.00
2     3     6   9.0  9.00

pd.pivot_table的{​​{3}}解释了原因:

  

aggfunc :函数,函数列表,字典,默认numpy.mean

     

如果传递了功能列表,则结果数据透视表将具有   顶层是函数名称的分层列   来自函数对象本身)如果传递了dict,则密钥为   要汇总的列,值是函数或函数列表

答案 1 :(得分:2)

我建议在DataFrameGroupBy.agg处使用

f1 = lambda x: np.percentile(x, 50)
f2 = lambda x: np.percentile(x, 75)

pivoted_df = (df.groupby(['col1', 'col2'])['col3']
                .agg([('lam1', f1), ('lam2', f2)])
                .reset_index())
print (pivoted_df)
   col1  col2  lam1  lam2
0     1     4   8.5  9.25
1     2     5   8.0  8.00
2     3     6   9.0  9.00