【问题标题】:Pandas - Add many new columns based on many aggregate functionsPandas - 基于许多聚合函数添加许多新列
【发布时间】:2020-11-21 15:59:50
【问题描述】:

熊猫 1.0.5

import pandas as pd
d = pd.DataFrame({
    "card_id": [1, 1, 2, 2, 1, 1, 2, 2],
    "day": [1, 1, 1, 1, 2, 2, 2, 2],
    "amount": [1, 2, 10, 20, 3, 4, 30, 40]
  })

#add columns
d['count'] = d.groupby(['card_id', 'day'])["amount"].transform('count')
d['min'] = d.groupby(['card_id', 'day'])["amount"].transform('min')
d['max'] = d.groupby(['card_id', 'day'])["amount"].transform('max')

我想将三条变换线改为一条线。我试过这个:

d['count', 'min', 'max'] = d.groupby(['card_id', 'day'])["amount"].transform('count', 'min', 'max')

错误:“TypeError:count() 接受 1 个位置参数,但给出了 3 个”

我也试过这个:

d[('count', 'min', 'max')] = d.groupby(['card_id', 'day']).agg(
    count = pd.NamedAgg('amount', 'count')
    ,min = pd.NamedAgg('amount', 'min')
    ,max = pd.NamedAgg('amount', 'max')
)

错误:“TypeError:插入列的索引与框架索引不兼容”

【问题讨论】:

    标签: pandas pandas-groupby


    【解决方案1】:

    使用合并,

    d = pd.DataFrame({
        "card_id": [1, 1, 2, 2, 1, 1, 2, 2],
        "day": [1, 1, 1, 1, 2, 2, 2, 2],
        "amount": [1, 2, 10, 20, 3, 4, 30, 40]
      })
    
    df_out = d.groupby(['card_id', 'day']).agg(
        count = pd.NamedAgg('amount', 'count')
        ,min = pd.NamedAgg('amount', 'min')
        ,max = pd.NamedAgg('amount', 'max')
    )
    
    d.merge(df_out, left_on=['card_id', 'day'], right_index=True)
    

    输出:

       card_id  day  amount  count  min  max
    0        1    1       1      2    1    2
    1        1    1       2      2    1    2
    2        2    1      10      2   10   20
    3        2    1      20      2   10   20
    4        1    2       3      2    3    4
    5        1    2       4      2    3    4
    6        2    2      30      2   30   40
    7        2    2      40      2   30   40
    

    您 groupyby 的输出正在创建一个多级索引,并且此输出的索引与 d 的索引不匹配,因此出现错误。但是,我们可以通过合并列名和 right_index=True 将 d 中的列连接到组输出中的索引。

    【讨论】:

      【解决方案2】:

      您可以使用assign 函数一次性获取结果:

      grouping = df.groupby(["card_id", "day"])
      df.assign(
          count=grouping.transform("count"),
          min=grouping.transform("min"),
          max=grouping.transform("max"),
      )
      
      
       card_id    day amount  count   min max
      0   1       1   1       2       1   2
      1   1       1   2       2       1   2
      2   2       1   10      2       10  20
      3   2       1   20      2       10  20
      4   1       2   3       2       3   4
      5   1       2   4       2       3   4
      6   2       2   30      2       30  40
      7   2       2   40      2       30  40
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-17
        • 1970-01-01
        • 2012-06-12
        • 1970-01-01
        • 2020-09-28
        • 1970-01-01
        相关资源
        最近更新 更多