Python 熊猫-按列分组,然后根据结果创建新列
我有一个数据框,其中包含了针对不同人群的多个测试结果。 它有Python 熊猫-按列分组,然后根据结果创建新列,python,pandas,Python,Pandas,我有一个数据框,其中包含了针对不同人群的多个测试结果。 它有名称,年龄,分数 scores=pd.DataFrame({'name':['Alex'、'Alex'、'Alex'、'James'、'James'、'James'、'James'、'Emily'、'Emily'、'Emily'、'Emily'、'Emily'、'Emily'、'Emily','age':[25,26,26,27,27,25,25,26,26,26,26,26,26,26,27,27,27],'scores':[10,2
名称
,年龄
,分数
scores=pd.DataFrame({'name':['Alex'、'Alex'、'Alex'、'James'、'James'、'James'、'James'、'Emily'、'Emily'、'Emily'、'Emily'、'Emily'、'Emily'、'Emily','age':[25,26,26,27,27,25,25,26,26,26,26,26,26,26,27,27,27],'scores':[10,2,2,2,2,2,4,4,4,6,6,10,10])
我在姓名
和年龄
上进行了分组,并进行了汇总,得出每个组的最大得分
(这是个人每年的得分
列的max
值)
age\u scores=scores.groupby(['name','age']).agg({“scores”:'max'})
结果看起来像
score
name age
Alex 25 10
26 2
27 2
Emily 25 7
26 10
27 10
James 25 2
26 6
27 10
我想有一个数据框,每个人一行,然后每个年龄的最大分数列
i、 e
如果要转换年龄分数,请使用
pivot
:
(age_scores
.reset_index()
.pivot('name', 'age', 'score')
.add_prefix('max_')
.reset_index()
.rename_axis(None, axis=1))
输出:
name max_25 max_26 max_27
0 Alex 10 2 2
1 Emily 7 10 10
2 James 2 6 10
age name max_25 max_26 max_27
0 Alex 10 2 2
1 Emily 7 10 10
2 James 2 6 10
否则,如果您不需要将
age\u分数
作为中间数据帧,那么Chris在评论中提出的unstack
解决方案可能更简单:
(scores
.groupby(['name', 'age'])['score'].max()
.unstack('age')
.add_prefix('max_')
.reset_index())
输出:
name max_25 max_26 max_27
0 Alex 10 2 2
1 Emily 7 10 10
2 James 2 6 10
age name max_25 max_26 max_27
0 Alex 10 2 2
1 Emily 7 10 10
2 James 2 6 10
如果要转换年龄分数,请使用
pivot
:
(age_scores
.reset_index()
.pivot('name', 'age', 'score')
.add_prefix('max_')
.reset_index()
.rename_axis(None, axis=1))
输出:
name max_25 max_26 max_27
0 Alex 10 2 2
1 Emily 7 10 10
2 James 2 6 10
age name max_25 max_26 max_27
0 Alex 10 2 2
1 Emily 7 10 10
2 James 2 6 10
否则,如果您不需要将
age\u分数
作为中间数据帧,那么Chris在评论中提出的unstack
解决方案可能更简单:
(scores
.groupby(['name', 'age'])['score'].max()
.unstack('age')
.add_prefix('max_')
.reset_index())
输出:
name max_25 max_26 max_27
0 Alex 10 2 2
1 Emily 7 10 10
2 James 2 6 10
age name max_25 max_26 max_27
0 Alex 10 2 2
1 Emily 7 10 10
2 James 2 6 10
这回答了你的问题吗?使用
unstack
:df.groupby([“name”,“age”])[“score”].max().unstack()
这是否回答了您的问题?使用unstack
:df.groupby([“name”,“age”])[“score”].max().unstack()
谢谢!这非常有帮助,并且完全满足了我的需要:)奇怪的是,尽管重置索引使age
成为索引,我似乎无法摆脱它是的,因此age
是列的名称。您可以使用df.columns.name=None
重置它,如果您想链接它,也可以使用rename\u axis
重置它。我已经更新了解决方案(pivot的部分),将该名称重置为None。如果你想要更多的细节,这里有这个谢谢你!这非常有帮助,并且完全满足了我的需要:)奇怪的是,尽管重置索引使age
成为索引,我似乎无法摆脱它是的,因此age
是列的名称。您可以使用df.columns.name=None
重置它,如果您想链接它,也可以使用rename\u axis
重置它。我已经更新了解决方案(pivot的部分),将该名称重置为None。如果你想要更多的细节,这里有这个