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。如果你想要更多的细节,这里有这个