2016-03-28 3 views
1

У меня есть следующие detaframe ББ:Python панд dataframe 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» и взять первые два наименьшую «bq_back_price». Мне удалось сделать это с

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

Проблема в том, что я пропускаю некоторые из столбцов, такие как «bq_selection_id», «bq_balance» и столбце «bq_back_price» не имеет имени. Это то, что я получаю

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

Вы можете использовать merge по indexes:

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) 

После этого вы можете фильтровать bb для самых низких 2 цен (ранг 1 и 2).

bb[bb['rank'] < 3] 

Кредит: python pandas rank by column

+1

Вы можете добавить метод '=«первый», чтобы гарантировать, что не более 2 строк в каждой группе не имеют ранг <3. – unutbu

Смежные вопросы