【问题标题】:pandas.pivot_table : How to name functions for aggregationpandas.pivot_table :如何命名聚合函数
【发布时间】:2018-10-18 09:00:45
【问题描述】:

我正在尝试使用几个聚合函数来旋转 pandas DataFrame,其中一些是 lambda。每列必须有一个不同的名称,以便通过几个 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,它也会导致错误。有人可以帮忙吗?谢谢!

【问题讨论】:

    标签: python pandas lambda pivot-table


    【解决方案1】:

    明确命名函数:

    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_tabledocs 解释原因:

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

    如果函数列表通过,生成的数据透视表将包含 顶层是函数名称的分层列推断 来自函数对象本身)如果传递了dict,则键是 要聚合的列和值是函数或函数列表

    【讨论】:

    • @Marina,当然,我的意思是 jezrael 的解决方案有效没问题。您可能希望注意到PEP8 中的此声明:Always use a def statement instead of an assignment statement that binds a lambda expression directly to an identifier. lambda 命名解决方案是后者的一个示例。
    • 非常感谢。两种解决方案都有效,我接受了您的解决方案,因为它们同样提供丰富的信息,但是您的解决方案来得更快。干杯
    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2016-11-29
      • 2020-05-01
      • 1970-01-01
      • 2019-11-29
      • 1970-01-01
      • 1970-01-01
      • 2013-10-05
      • 2021-12-24
      • 2017-01-29
      相关资源
      最近更新 更多