Python 如何对熊猫进行分组、排序,然后取回熊猫中第二高的一行?

Python 如何对熊猫进行分组、排序,然后取回熊猫中第二高的一行?,python,pandas,sorting,group-by,Python,Pandas,Sorting,Group By,我想首先按ID对数据进行分组,对Offer列执行降序排序,然后获取第二行。我如何使用熊猫来实现这一点 ID Vehicle Auction Offer 0 3580845 2005 Volvo XC90 V8 Copart 215 1 3580845 2005 Volvo XC90 V8 Manheim Salvage API 170 2 3580845 2005

我想首先按
ID
对数据进行分组,对
Offer
列执行降序排序,然后获取第二行。我如何使用熊猫来实现这一点

     ID             Vehicle              Auction       Offer
0   3580845  2005 Volvo XC90 V8               Copart    215
1   3580845  2005 Volvo XC90 V8  Manheim Salvage API    170
2   3580845  2005 Volvo XC90 V8       Merged Salvage    195
3   3580845  2005 Volvo XC90 V8      Manheim Salvage    390
4   3580845  2005 Volvo XC90 V8                  IAA    270
5   3580845  2005 Volvo XC90 V8                  SVP    175
6   3580789   2003 Lexus ES 300               Copart    180
7   3580789   2003 Lexus ES 300       Merged Salvage    190
8   3580789   2003 Lexus ES 300      Manheim Salvage    355
9   3580789   2003 Lexus ES 300                  IAA    270
10  3580789   2003 Lexus ES 300                  SVP    180
预期:

     ID             Vehicle              Auction       Offer
0   3580845  2005 Volvo XC90 V8                  IAA    270
1   3580789   2003 Lexus ES 300                  IAA    270
首先需要并使用计数值,然后按以下方式过滤:

首先需要并使用计数值,然后按以下方式过滤:


您还可以结合使用
groupby
rank

from io import StringIO
import pandas as pd

data = pd.read_table(StringIO("""ID Vehicle Auction Offer
3580845 2005VolvoXC90V8 Copart 215
3580845 2005VolvoXC90V8 ManheimSalvageAPI 170
3580845 2005VolvoXC90V8 MergedSalvage 195
3580845 2005VolvoXC90V8 ManheimSalvage 390
3580845 2005VolvoXC90V8 IAA 270
3580845 2005VolvoXC90V8 SVP 175
3580789 2003LexusES300 Copart 180
3580789 2003LexusES300 MergedSalvage 190
3580789 2003LexusES300 ManheimSalvage 355
3580789 2003LexusES300 IAA 270
3580789 2003LexusES300 SVP 180"""), sep=' ')

offer_rank_by_id = data.groupby('ID').rank(method = 'min', ascending = False).loc[:,'Offer'] == 2 # using 2 because we want to select the second highest offer for each id

data.loc[offer_rank_by_id,:]

#         ID          Vehicle Auction  Offer
# 4  3580845  2005VolvoXC90V8     IAA    270
# 9  3580789   2003LexusES300     IAA    270

您还可以结合使用
groupby
rank

from io import StringIO
import pandas as pd

data = pd.read_table(StringIO("""ID Vehicle Auction Offer
3580845 2005VolvoXC90V8 Copart 215
3580845 2005VolvoXC90V8 ManheimSalvageAPI 170
3580845 2005VolvoXC90V8 MergedSalvage 195
3580845 2005VolvoXC90V8 ManheimSalvage 390
3580845 2005VolvoXC90V8 IAA 270
3580845 2005VolvoXC90V8 SVP 175
3580789 2003LexusES300 Copart 180
3580789 2003LexusES300 MergedSalvage 190
3580789 2003LexusES300 ManheimSalvage 355
3580789 2003LexusES300 IAA 270
3580789 2003LexusES300 SVP 180"""), sep=' ')

offer_rank_by_id = data.groupby('ID').rank(method = 'min', ascending = False).loc[:,'Offer'] == 2 # using 2 because we want to select the second highest offer for each id

data.loc[offer_rank_by_id,:]

#         ID          Vehicle Auction  Offer
# 4  3580845  2005VolvoXC90V8     IAA    270
# 9  3580789   2003LexusES300     IAA    270