Python 在对分组对象执行操作并相应地创建变量后,为数据帧编制索引
我有一个如下所示的数据框:Python 在对分组对象执行操作并相应地创建变量后,为数据帧编制索引,python,pandas,pandas-groupby,Python,Pandas,Pandas Groupby,我有一个如下所示的数据框: Id Category Score 1 M 0.2 2 C 0.4 2 M 0.3 1 C 0.1 2 M 0.3 1 M 0.2 1 C 0.1 1 C 0.1 2 C 0.4 我想按Id和Category进行分组,然后找到最大分数,并创建一个名
Id Category Score
1 M 0.2
2 C 0.4
2 M 0.3
1 C 0.1
2 M 0.3
1 M 0.2
1 C 0.1
1 C 0.1
2 C 0.4
我想按Id
和Category
进行分组,然后找到最大分数,并创建一个名为Category\u Label
的新变量,其行等于最大分数索引处的Category
输出应该如下所示
Id Category Score Category_Label
1 M 0.2 M
2 C 0.4 C
2 M 0.3 C
1 C 0.1 M
2 F 0.03 C
1 M 0.2 M
1 C 0.1 M
1 E 0.01 M
2 C 0.4 C
换句话说,新变量“Category_Label应该等于对应于所有1的最大分数的
Category`行
我试过这个:
df[df['Category_Label']] == df.loc[df.groupby(['Id','Category'])['Score'].transform(lambda a: a.max())],'Category' ]
但我离你很远!!我对此进行了调查,但他们的帮助还不够 您可以使用
apply
获得Score
idxmax
,将其用于类别
值。然后使用Id
In [1591]: df.Id.map(df.groupby('Id').apply(lambda x: x.loc[x.Score.idxmax(), 'Category']))
Out[1591]:
0 M
1 C
2 C
3 M
4 C
5 M
6 M
7 M
8 C
Name: Id, dtype: object
细节
In [1592]: df.groupby('Id').apply(lambda x: x.loc[x.Score.idxmax(), 'Category'])
Out[1592]:
Id
1 M
2 C
dtype: object
In [1593]: df['Category_Label'] = df.Id.map(
df.groupby('Id')
.apply(lambda x: x.loc[x.Score.idxmax(), 'Category']))
In [1594]: df
Out[1594]:
Id Category Score Category_Label
0 1 M 0.2 M
1 2 C 0.4 C
2 2 M 0.3 C
3 1 C 0.1 M
4 2 M 0.3 C
5 1 M 0.2 M
6 1 C 0.1 M
7 1 C 0.1 M
8 2 C 0.4 C
- 使用
查找idxmax
位置的位置李>max
- 使用
跨所有索引广播transform
- 使用
中的结果获取loc
值Category
- 分配给新列
或者您可以尝试不使用
groupby
df.merge(df.sort_values(['Id','Score']).\
drop_duplicates(['Id'],keep ='last')[['Id','Category']],on='Id',how='left').\
rename(columns={'Category_x':'Category','Category_y':'Category_Label'})
Out[176]:
Id Category Score Category_Label
0 1 M 0.20 M
1 2 C 0.40 C
2 2 M 0.30 C
3 1 C 0.10 M
4 2 F 0.03 C
5 1 M 0.20 M
6 1 C 0.10 M
7 1 E 0.01 M
8 2 C 0.40 C
"1594"... 重新启动REPL的时间:p@JohnGalt阅读问题,OP由
['Id','Category']
说。然而,这毫无意义。谢谢你指出这一点。我喜欢你的解决方案,这更干净。
df.merge(df.sort_values(['Id','Score']).\
drop_duplicates(['Id'],keep ='last')[['Id','Category']],on='Id',how='left').\
rename(columns={'Category_x':'Category','Category_y':'Category_Label'})
Out[176]:
Id Category Score Category_Label
0 1 M 0.20 M
1 2 C 0.40 C
2 2 M 0.30 C
3 1 C 0.10 M
4 2 F 0.03 C
5 1 M 0.20 M
6 1 C 0.10 M
7 1 E 0.01 M
8 2 C 0.40 C