Pandas groupby(),agg() - 如何在没有多索引的情况下返回结果?

Posted

技术标签:

【中文标题】Pandas groupby(),agg() - 如何在没有多索引的情况下返回结果?【英文标题】:Pandas groupby(),agg() - how to return results without the multi index? 【发布时间】:2014-12-07 01:40:30 【问题描述】:

我有一个数据框:

pe_odds[ [ 'EVENT_ID', 'SELECTION_ID', 'ODDS' ] ]
Out[67]: 
     EVENT_ID  SELECTION_ID   ODDS
0   100429300       5297529  18.00
1   100429300       5297529  20.00
2   100429300       5297529  21.00
3   100429300       5297529  22.00
4   100429300       5297529  23.00
5   100429300       5297529  24.00
6   100429300       5297529  25.00

当我使用 groupby 和 agg 时,我得到的结果是多索引:

pe_odds.groupby( [ 'EVENT_ID', 'SELECTION_ID' ] )[ 'ODDS' ].agg( [ np.min, np.max ] )
Out[68]: 
                         amin   amax
EVENT_ID  SELECTION_ID              
100428417 5490293        1.71   1.71
          5881623        1.14   1.35
          5922296        2.00   2.00
          5956692        2.00   2.02
100428419 603721         2.44   2.90
          4387436        4.30   6.20
          4398859        1.23   1.35
          4574687        1.35   1.46
          4881396       14.50  19.00
          6032606        2.94   4.20
          6065580        2.70   5.80
          6065582        2.42   3.65
100428421 5911426        2.22   2.52

我已经尝试使用 as_index 来返回没有 multi_index 的结果:

pe_odds.groupby( [ 'EVENT_ID', 'SELECTION_ID' ], as_index=False )[ 'ODDS' ].agg( [ np.min, np.max ], as_index=False )

但它仍然给了我一个多索引。

我可以使用.reset_index(),但是很慢:

pe_odds.groupby( [ 'EVENT_ID', 'SELECTION_ID' ] )[ 'ODDS' ].agg( [ np.min, np.max ] ).reset_index()

pe_odds.groupby( [ 'EVENT_ID', 'SELECTION_ID' ] )[ 'ODDS' ].agg( [ np.min, np.max ] ).reset_index()
Out[69]: 
     EVENT_ID  SELECTION_ID   amin   amax
0   100428417       5490293   1.71   1.71
1   100428417       5881623   1.14   1.35
2   100428417       5922296   2.00   2.00
3   100428417       5956692   2.00   2.02
4   100428419        603721   2.44   2.90
5   100428419       4387436   4.30   6.20

如何在没有多索引的情况下使用 groupby 和/或 agg 函数的参数返回结果。并且不必求助于使用 reset_index() ?

【问题讨论】:

【参考方案1】:

以下调用:

>>> gr = df.groupby(['EVENT_ID', 'SELECTION_ID'], as_index=False)
>>> res = gr.agg('ODDS':[np.min, np.max])
>>> res
    EVENT_ID SELECTION_ID ODDS     
                          amin amax
0  100429300      5297529   18   25
1  100429300      5297559   30   38

返回一个具有多索引的框架。如果您不希望列成为多索引,您也可以这样做:

>>> res.columns = list(map(''.join, res.columns.values))
>>> res
    EVENT_ID  SELECTION_ID  ODDSamin  ODDSamax
0  100429300       5297529        18        25
1  100429300       5297559        30        38

【讨论】:

在 pandas v0.24.0 中,.to_flat_index() 函数被引入列。将命令稍微更改为:res.columns = ["_".join(col_name).rstrip('_') for col_name in res.columns.to_flat_index()]。 (请注意我如何加入“_”而不是空格,以使用下划线而不是空格来连接第一级和第二级列名。这对我来说感觉更像 Python,但纯粹是我个人的偏好。)

以上是关于Pandas groupby(),agg() - 如何在没有多索引的情况下返回结果?的主要内容,如果未能解决你的问题,请参考以下文章

如何加快pandas groupby bins的agg?

python处理数据的风骚操作[pandas 之 groupby&agg]

Pandas groupby(),agg() - 如何在没有多索引的情况下返回结果?

Pandas GroupBy.agg() 抛出 TypeError: aggregate() 缺少 1 个必需的位置参数:'arg'

Pandas Groupby Agg 函数不减少

Pandas`agc`列表,“AttributeError / ValueError:函数不减少”