2016-11-02 5 views
2

パンダではgroupby,nlargestsumの機能を併用しようとしていますが、問題があります。パンダスグループ最高額合計

State County Population 
Alabama a   100 
Alabama b   50 
Alabama c   40 
Alabama d   5 
Alabama e   1 
... 
Wyoming a.51  180 
Wyoming b.51  150 
Wyoming c.51  56 
Wyoming d.51  5 

私は人口でトップ2郡を取得し、その後、状態によって選択することがgroupbyを使用したいです。その後、その州の合計を得るために、上位3つの郡の人口番号のみを使用します。

最後に、州と人口(その上位2郡)のリストを作成します。

私はgroupbynlargestを動作させることができますが、nlargest(2)の合計が問題になります。私はあなたが持っているこの問題はdf.groupby('State')['Population'].nlargest(2)は、データフレームを返すことだと思います

df.groupby('State')['Population'].apply(lambda grp: grp.nlargest(2).sum()) 

、:

私が今持っているラインは単純です:df.groupby('State')['Population'].nlargest(2)

答えて

13

あなたはgroupbyを実行した後applyを使用することができますもはやグループレベルの操作を行うことはできません。一般的に、グループ内で複数の操作を実行する場合は、apply/aggを使用する必要があります。

結果出力:@のcᴏʟᴅsᴘᴇᴇᴅによって示唆されるように

State 
Alabama 150 
Wyoming 330 

EDIT

Aわずかにクリーナーアプローチ:

df.groupby('State')['Population'].nlargest(2).sum(level=0) 

これは、より大きなデータフレームにapplyを使用するよりもわずかに遅いですしかし、。私は、次のタイミングを取得

import numpy as np 
import pandas as pd 
from string import ascii_letters 

n = 10**6 
df = pd.DataFrame({'A': np.random.choice(list(ascii_letters), size=n), 
        'B': np.random.randint(10**7, size=n)}) 

In [3]: %timeit df.groupby('A')['B'].apply(lambda grp: grp.nlargest(2).sum()) 
103 ms ± 1.08 ms per loop (mean ± std. dev. of 7 runs, 10 loops each) 

In [4]: %timeit df.groupby('A')['B'].nlargest(2).sum(level=0) 
147 ms ± 3.38 ms per loop (mean ± std. dev. of 7 runs, 10 loops each) 

パフォーマンスの低下は、潜在的にボンネットの下に二groupbyを行っsumlevel kwargによって引き起こされる

次のセットアップを使用しました。 aggを使用して

+1

あなたは 'df.groupby(「国家」)[「人口」]を使用して、適用を取り除くことによって、これを修正する必要があります。nlargest(2) .sum(level = 0) ' –

+1

@cᴏʟᴅsᴘᴇᴇᴅ:' .nlargest(2).sum(level = 0) 'のあなたの提案された解決策は、データフレームサイズがかなりの場合に' apply'を使うよりも実際に遅くなります。 'sum'の' level' kwargは、フードの下で2回目のgroupby操作を実行します。これは余分なオーバーヘッドがどこから来るのかと推測しています。 – root

+1

それは驚くべきことです。したがって、1つのgroupby +適用は2つのグループを優先します。新しい何かを学んだ、歓声! –

2

は、グループ化ロジックは次のようになります。

df.groupby('State').agg({'Population': {lambda x: x.nlargest(2).sum() }})

これは、別のデータフレームのオブジェクトになり、これはあなたが最も人口の多い州を見つけるために照会することができ、など

  Population 
State 
Alabama 150 
Wyoming 330 
+0

その中括弧がありません – diabolicfreak

+0

@diabolicfreakありがとう、私は私の答えを編集しました。 – aquaraga