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() - 如何在没有多索引的情况下返回结果?的主要内容,如果未能解决你的问题,请参考以下文章
python处理数据的风骚操作[pandas 之 groupby&agg]
Pandas groupby(),agg() - 如何在没有多索引的情况下返回结果?
Pandas GroupBy.agg() 抛出 TypeError: aggregate() 缺少 1 个必需的位置参数:'arg'