2017-08-19 15 views
1

でCumcountを用いて第2の最適な行を選択すると、私が持っているデータである。は条件付きでグループ化を実行し、ここでパンダ

ID    Vehicle  Calculator  Offer NextCalculator NextOffer 
3497827 2002 Ford Explorer Manheim Salvage 190 Copart   190 
3497827 2002 Ford Explorer Manheim Salvage 190 IAA    140 
3497827 2002 Ford Explorer Manheim Salvage 190 Manheim Salvage 190 
3497827 2002 Ford Explorer Manheim Salvage 190 SVP    55 
3497828 2003 Honda CRV  Manheim Salvage 320 Copart   150 
3497828 2003 Honda CRV  Manheim Salvage 320 IAA    320 
3497828 2003 Honda CRV  Manheim Salvage 320 Manheim Salvage 320 
3497828 2003 Honda CRV  Manheim Salvage 320 SVP    200 

私が何をしたいのか、各車両のための次善の電卓のオファーであるかを調べるのですか?例えば。 IAA 190(私たちはそれの後の次たいので、マンハイムサルベージを考慮しない)となります3497828次の最善のオファーのために - - 3497827のために、次の最高のオファーはCopartあるこれまでのところ私が行っている320

df = df.sort_values(['ID', 'NextOffer'], ascending=False) 
df1 = df[df.groupby('ID').cumcount() == 1] 
私を与え

ID    Vehicle  Calculator  Offer NextCalculator NextOffer 
3497827 2002 Ford Explorer Manheim Salvage 190 Manheim Salvage   190 
3497828 2003 Honda CRV  Manheim Salvage 320 IAA    320 

それはNextOfferはオファーと同じである場合NextOffersはオファー値よりも小さいですが、ない場合にのみ、私は正しい結果を与えます。

私は何をしたいことは次のとおりです。

ID    Vehicle  Calculator  Offer NextCalculator NextOffer 
3497827 2002 Ford Explorer Manheim Salvage 190 Copart   190 
3497828 2003 Honda CRV  Manheim Salvage 320 IAA    320 

だから私の推測では、最初に私がcumcount()== 0をしなければならないでしょうし、その行のNextCalculatorCalculatorと同じであるならば、私が取得しなければならないということです2番目の行はcumcount()== 1を使用しています。これをどのように行うことができますか、または望ましい出力を得る効率的な方法はありますか?

答えて

2

IIUC:

In [21]: df.loc[df.query("Calculator != NextCalculator") 
        .groupby('ID', as_index=False).NextOffer.idxmax()] 
Out[21]: 
      ID  Vehicle  Calculator Offer NextCalculator NextOffer 
0 3497827 2002 Ford Explorer Manheim Salvage 190   Copart  190 
5 3497828 2003  Honda CRV Manheim Salvage 320   IAA  320 
+0

うわー!これは機能します。すぐにお返事ありがとうございますMaxU – Shaunak

+0

@スハナク、あなたは歓迎です:) – MaxU

関連する問題