2017-08-11 7 views
1

データを最初にIDでグループ化し、Offer列で降順ソートを実行してから、2番目の行をフェッチします。私はパンダを使ってこれをどのように達成できますか?Pandasで2番目に高い行をグループ化、ソート、フェッチする方法は?

期待
 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 

答えて

2

まず必要sort_valuesとカウント値のためcumcountを使用して、boolean indexingでフィルタ:

df = df.sort_values(['ID','Offer'], ascending=False) 
df1 = df[df.groupby('ID').cumcount() == 1] 
print (df1) 
      ID  Vehicle Auction Offer 
4 3580845 2005 Volvo XC90 V8  IAA 270 
9 3580789 2003 Lexus ES 300  IAA 270 
+0

大歓迎です! – jezrael

1

あなたはまた、それが一緒にgroupbyrankを使用して行うことができます。

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 
関連する問題