获取 groupby 和 nlargest 之后的行索引
Get index of rows after groupby and nlargest
我有一个大数据框,我想在其中使用 groupby
和 nlargest
来查找每个组的第二大、第三、第四和第五大值。我有 500 多个组,每个组都有 1000 多个值。在应用 groupby
和 nlargest
之后,我还想在数据框中保留其他列。我的数据框看起来像这样
df = pd.DataFrame({
'group': [1,2,3,3,4, 5,6,7,7,8],
'a': [4, 5, 3, 1, 2, 20, 10, 40, 50, 30],
'b': [20, 10, 40, 50, 30, 4, 5, 3, 1, 2],
'c': [25, 20, 5, 15, 10, 25, 20, 5, 15, 10]
})
要为列 a
查找每个组的第二、第三、第四大等等,我使用
secondlargest = df.groupby(['group'], as_index=False)['a'].apply(lambda grp: grp.nlargest(2).min())
哪个returns
group a
0 1 4
1 2 5
2 3 1
3 4 2
4 5 20
5 6 10
6 7 40
7 8 30
我需要在此生成的数据框中显示列 b
和 c
。我使用以下内容对原始数据框进行子集化,但它 returns 是一个空数据框。我该如何修改代码?
secondsubset = df[df.groupby(['group'])['a'].apply(lambda grp: grp.nlargest(2).min())]
如果我正确理解你的目标,你应该可以直接删除 as_index=False
,使用 idxmin
而不是 min
,将结果传递给 df.loc
:
df.loc[df.groupby('group')['a'].apply(lambda grp: grp.nlargest(2).idxmin())]
您可以使用 agg lambda。更整洁
df.groupby('group').agg(lambda grp: grp.nlargest(2).min())
我有一个大数据框,我想在其中使用 groupby
和 nlargest
来查找每个组的第二大、第三、第四和第五大值。我有 500 多个组,每个组都有 1000 多个值。在应用 groupby
和 nlargest
之后,我还想在数据框中保留其他列。我的数据框看起来像这样
df = pd.DataFrame({
'group': [1,2,3,3,4, 5,6,7,7,8],
'a': [4, 5, 3, 1, 2, 20, 10, 40, 50, 30],
'b': [20, 10, 40, 50, 30, 4, 5, 3, 1, 2],
'c': [25, 20, 5, 15, 10, 25, 20, 5, 15, 10]
})
要为列 a
查找每个组的第二、第三、第四大等等,我使用
secondlargest = df.groupby(['group'], as_index=False)['a'].apply(lambda grp: grp.nlargest(2).min())
哪个returns
group a
0 1 4
1 2 5
2 3 1
3 4 2
4 5 20
5 6 10
6 7 40
7 8 30
我需要在此生成的数据框中显示列 b
和 c
。我使用以下内容对原始数据框进行子集化,但它 returns 是一个空数据框。我该如何修改代码?
secondsubset = df[df.groupby(['group'])['a'].apply(lambda grp: grp.nlargest(2).min())]
如果我正确理解你的目标,你应该可以直接删除 as_index=False
,使用 idxmin
而不是 min
,将结果传递给 df.loc
:
df.loc[df.groupby('group')['a'].apply(lambda grp: grp.nlargest(2).idxmin())]
您可以使用 agg lambda。更整洁
df.groupby('group').agg(lambda grp: grp.nlargest(2).min())