【问题标题】:Pandas Dataframe Aggregate Object TypePandas Dataframe 聚合对象类型
【发布时间】:2021-07-28 17:17:43
【问题描述】:

目标

  • 我有一个带有浮点和对象类型的 pandas 数据框。

  • 我想按“名称”列对数据框进行分组 groupped = df.groupby(["name"])

  • 比聚合所有其他列。

  • 我将某些列的浮点值加在一起

  • 但我也有“对象类型”,目标是只保留 1 个对象类型,例如:第一个。他们是一样的。所以我尝试使用 min 但它不起作用但我找不到任何其他适用于对象类型的函数。

aggregated = groupped.agg({ 
         'name' : ['min'],
         'id' : ['min'],
         'date' : ['min'],
         'number_one' : ['sum'],
         'type' : ['min'],
         'number_two' : ['sum'],
})

错误

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-102-3594b7bd0c31> in <module>
      9          'number_one' : ['sum'],
     10          'type' : ['min'],
---> 11          'number_two' : ['sum'],
     12 })
     13 
...
TypeError: '<=' not supported between instances of 'str' and 'float'

已经尝试过

【问题讨论】:

    标签: python python-3.x pandas group-by aggregate


    【解决方案1】:

    第一个想法是使用GroupBy.first 作为对象列:

    aggregated = groupped.agg({ 
             'name' : ['first'],
             'id' : ['first'],
             'date' : ['first'],
             'number_one' : ['sum'],
             'type' : ['first'],
             'number_two' : ['sum'],
    })
    

    如果想避免MultiIndex 删除[]

    aggregated = groupped.agg({ 
             'name' : 'first',
             'id' : 'first',
             'date' : 'first',
             'number_one' : 'sum',
             'type' : 'first',
             'number_two' : 'sum',
    })
    

    更通用的解决方案是数字列聚合sum,而另一列在 lambda 函数中获取第一个值:

    f = lambda x: x.sum() if np.issubdtype(x.dtype, np.number) else x.iat[0]
    aggregated = groupped.agg(f)
    

    【讨论】:

    • 30 秒内完美。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2021-04-14
    • 2020-01-28
    • 2018-04-16
    • 1970-01-01
    • 1970-01-01
    • 2021-04-06
    • 2018-08-21
    • 1970-01-01
    相关资源
    最近更新 更多