2016-03-28 18 views
1

Ich habe folgende detaframe bb:Python pandas Datenrahmen groupby Auswählen von Spalten

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 

möchte ich „market_id“ zu gruppieren und nehmen ersten beiden niedrigsten „bq_back_price“. Ich schaffte es, dies zu tun mit

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

Das Problem ist, dass ich einige der Spalten wie „bq_selection_id“, „bq_balance“ und Spalte „bq_back_price“ name hat nicht fehle. Das ist, was ich

bq_market_id 
7278437  0 1.97 
7278437  1 1.97 

bekommen Und ich möchte so etwas wie dieses

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 

Können Sie erhalten mir bitte helfen?

Antwort

0

können Sie merge von indexes verwenden:

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 nette Antwort gelöscht, aber ich denke, es ist besser, als meine Antwort:

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

Sie können zunächst Werte sortieren bq_back_price, und dann Nehmen Sie head(2) in jeder Gruppe.

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

Wie wäre es, eine neue "Rank" -Spalte anzuhängen?

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

Danach können Sie bb für die niedrigsten 2 Preise (Rang 1 und 2) filtern.

bb[bb['rank'] < 3] 

Credit: python pandas rank by column

+1

Vielleicht möchten Methode hinzufügen '= 'first', um sicherzustellen, dass nicht mehr als zwei Zeilen in jeder Gruppe Rang haben <3. – unutbu

Verwandte Themen