2016-03-28 43 views
1

I次detaframeのBB持っている:PythonのパンダのデータフレームGROUPBY選択列

bq_selection_id bq_balance bq_market_id bq_back_price 
0   45094462  185.04  7278437   1.97 
1   45094462  185.04  7278437   1.97 
2   45094463  185.04  7278437   3.05 
3   45094463  185.04  7278437   3.05 
4   45094464  185.04  7278437   5.80 
5   45094464  185.04  7278437   5.80 
6   45094466  185.04  7278437   200.00 
7   45094466  185.04  7278437   200.00 
8   45094465  185.04  7278437   NaN 
9   45094465  185.04  7278437   NaN 

私は "market_id" でグループに好きで、最初の2つの最低 "bq_back_price" を取るだろうし。私はこの問題は、私は、このような「bq_selection_id」、「bq_balance」など、列と列の「bq_back_price」のいくつかは名前を持っていない行方不明だということです

bb.groupby('bq_market_id')['bq_back_price'].nsmallest(2) 

でこれを行うことができました。それは私が

bq_market_id 
7278437  0 1.97 
7278437  1 1.97 

を得るものであり、あなたが私を助けてくださいすることができます私はこの

bq_selection_id bq_balance bq_market_id bq_back_price 
0   45094462  185.04  7278437   1.97 
1   45094462  185.04  7278437   1.97 

のようなものを取得したいのでしょうか?

答えて

0

あなたはindexesmergeを使用することができます。

print bb.groupby('bq_market_id')['bq_back_price'].nsmallest(2).reset_index(level=0, name='bq_back_price') 
    bq_market_id bq_back_price 
0  7278437   1.97 
1  7278437   1.97 

print pd.merge(bb[['bq_selection_id','bq_balance']], 
       bb.groupby('bq_market_id')['bq_back_price'].nsmallest(2).reset_index(level=0, name='bq_back_price'), 
       left_index=True, 
       right_index=True) 
    bq_selection_id bq_balance bq_market_id bq_back_price 
0   45094462  185.04  7278437   1.97 
1   45094462  185.04  7278437   1.97 

unutbuは、素敵な答えを削除し、私はそれが私の答えとして優れていると思う:

result = df.groupby('bq_market_id')['bq_back_price'].nsmallest(2) 
idx = result.index.get_level_values(-1) 
print(df.loc[idx]) 

    bq_selection_id bq_balance bq_market_id bq_back_price 
0   45094462  185.04  7278437   1.97 
1   45094462  185.04  7278437   1.97 
2

あなたはまずbq_back_priceに値をソートし、することができます各グループでhead(2)としてください。

In [218]: df.sort_values('bq_back_price').groupby('bq_market_id').head(2) 
Out[218]: 
    bq_selection_id bq_balance bq_market_id bq_back_price 
0   45094462  185.04  7278437   1.97 
1   45094462  185.04  7278437   1.97 
1

新しい「ランク」列を追加するのはどうですか?

bb['rank'] = bb.groupby(['bq_market_id'])['bq_back_price'].rank(ascending=True) 

その後、あなたは最低2つの価格BBをフィルタリングすることができます(ランク1及び2)。

bb[bb['rank'] < 3] 

クレジットへ:python pandas rank by column

+1

あなたは、各グループ内に2つの以上の行がランク<3を持っていないことを確認するために、「最初の」 'メソッドを=追加したい場合があります。 – unutbu

関連する問題