【问题标题】:pandas custom aggregation functionpandas 自定义聚合函数
【发布时间】:2019-11-05 07:35:20
【问题描述】:

我有一个 pandas 数据框,下面的命令适用:

house.groupby(['place_name'])['index_nsa'].agg(['first','last'])

它给了我想要的东西。现在我想创建一个自定义聚合值,它可以为我提供第一个值和最后一个值之间的百分比变化。

我在对值进行数学运算时出错,所以我认为我必须将它们转换为数字。

house.groupby(['place_name'])['index_nsa'].agg({"change in %":[(int('last')-int('first')/int('first')]})

不幸的是,我只在最后一个括号上得到一个语法错误,我似乎找不到错误。

有人看到我哪里出错了吗?

【问题讨论】:

    标签: python pandas aggregate pandas-groupby


    【解决方案1】:

    您需要在此处定义并将回调传递给agg。您可以使用 lambda 函数内联:

    house.groupby(['place_name'])['index_nsa'].agg([
        ("change in %", lambda x: (x.iloc[-1] - x.iloc[0]) / x.iloc[0])])
    

    仔细查看.agg 调用——要允许重命名输出列,您必须传递格式为[(new_name, agg_func), ...] 的元组列表。更多信息here

    如果你想以一些冗长为代价来避免使用 lambda,你可以使用

    def first_last_pct(ser):
        first, last = ser.iloc[0], ser.iloc[-1]
        return (last - first) / first
    
    house.groupby(['place_name'])['index_nsa'].agg([("change in %", first_last_pct)])
    

    【讨论】:

      猜你喜欢
      • 2015-07-04
      • 2017-08-04
      • 1970-01-01
      • 1970-01-01
      • 2019-06-08
      • 2021-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多