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

Gin*_*ger 16 python group-by aggregate multi-index pandas

我有一个数据帧:

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
Run Code Online (Sandbox Code Playgroud)

当我使用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
Run Code Online (Sandbox Code Playgroud)

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

pe_odds.groupby( [ 'EVENT_ID', 'SELECTION_ID' ], as_index=False )[ 'ODDS' ].agg( [ np.min, np.max ], as_index=False )
Run Code Online (Sandbox Code Playgroud)

但它仍然给我一个多指数.

我可以使用.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
Run Code Online (Sandbox Code Playgroud)

如何使用groupby和/或agg函数的参数在没有Multi-index的情况下返回结果.而不必诉诸使用reset_index()?

beh*_*uri 19

以下电话:

>>> 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
Run Code Online (Sandbox Code Playgroud)

返回带有mulit-index 的框架.如果您不希望列成为多索引,您可以执行以下操作:

>>> 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
Run Code Online (Sandbox Code Playgroud)

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