在对分组对象执行操作并相应地创建变量后索引数据框
Indexing a data frame after performing an operation on a grouped object and creating a variable accordingly
我有一个如下所示的数据框:
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_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_Labelshould be equal to the row of
Category`对应所有1的最大分数
我试过这个:
df[df['Category_Label']] == df.loc[df.groupby(['Id','Category'])['Score'].transform(lambda a: a.max())],'Category' ]
可是我好远!!我调查了这个 question and this,但它们的帮助还不够。
您可以使用 apply
并获得 Score
idxmax
,将其用于 Category
值。然后使用 map
of 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
个值
- 分配给新列
df.assign(
Category_Label=df.loc[
df.groupby('Id').Score.transform('idxmax'),
'Category'
].values
)
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
或者你可以不用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
我有一个如下所示的数据框:
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_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_Labelshould be equal to the row of
Category`对应所有1的最大分数
我试过这个:
df[df['Category_Label']] == df.loc[df.groupby(['Id','Category'])['Score'].transform(lambda a: a.max())],'Category' ]
可是我好远!!我调查了这个 question and this,但它们的帮助还不够。
您可以使用 apply
并获得 Score
idxmax
,将其用于 Category
值。然后使用 map
of 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
个值 - 分配给新列
df.assign(
Category_Label=df.loc[
df.groupby('Id').Score.transform('idxmax'),
'Category'
].values
)
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
或者你可以不用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