Pandas Dataframe 聚合对象类型

Posted

技术标签:

【中文标题】Pandas Dataframe 聚合对象类型【英文标题】:Pandas Dataframe Aggregate Object Type 【发布时间】: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'

已经尝试过

pandas dataframe aggregate calculation Filtering Pandas Dataframe Aggregate Aggregating in panda dataframe Pandas - DataFrame aggregate behaving oddly Pandas Dataframe aggregating Statistics python pandas dataframe aggregate groupby Conditionally Aggregating Pandas DataFrame https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.agg.html

【问题讨论】:

【参考方案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 秒内完美。谢谢。

以上是关于Pandas Dataframe 聚合对象类型的主要内容,如果未能解决你的问题,请参考以下文章

《Pandas Cookbook》第02章 DataFrame基本操作

如何从 Pandas DataFrame 中获取值而不是索引和对象类型

将 Pandas tseries 对象转换为 DataFrame

pandas聚合和分组运算之groupby

pandas之DataFrame

pandas 学习: pandas 数据结构之DataFrame