2017-02-03 4 views
1

私はWes McKinneyのPython for Data Analysisの例を理解しようとしています。私はパンダ料理の本、ドキュメント、そしてそれを見てきましたが、このような例は見つかりません。Pandasのapplyとgroupbyを理解する

この例では2012年の連邦選挙委員会データベース(https://github.com/wesm/pydata-book/blob/master/ch09.ipynb)を見ています。下のコードは、オバマとロムニーに寄付するトップドナーの職業を決定します。

私は、関数がgroupbyオブジェクトをどのように受け取り、別のgroupby操作を実行するかを理解するのに苦労しています。関数の外でこれを実行すると、エラーが発生します。誰かがこの行動についていくつかの光を当てることができましたか?

おかげで、

イワン

# top donor occupations donating to Obama or Romney 
def get_top_amounts(group, key, n = 5): 
    totals = group.groupby(key)['contb_receipt_amt'].sum() 

    return totals.sort_values(ascending = False)[:n] 

# first group by candidate 
grouped = fec_mrbo.groupby('cand_nm') 

# for each group, group again by contb_receipt_amt so we have a hierarchical index 
# take the contribution amount 
# then return the total amount for each occupation by cand sorted to give top n 
grouped.apply(get_top_amounts, 'contbr_occupation', n= 5) 

あなたが実際にグループを反復処理しているグループ化されたデータフレームにapplyを使用し、各グループを渡すと、結果はこの

cand_nm  contbr_occupation      
Obama, Barack RETIRED         25270507.23 
       ATTORNEY         11126932.97 
       INFORMATION REQUESTED      4849801.96 
       HOMEMAKER         4243394.30 
       PHYSICIAN         3732387.44 
       LAWYER          3159391.87 
       CONSULTANT         2459812.71 
Romney, Mitt RETIRED         11266949.23 
       INFORMATION REQUESTED PER BEST EFFORTS 11173374.84 
       HOMEMAKER         8037250.86 
       ATTORNEY         5302578.82 
       PRESIDENT         2403439.77 
       EXECUTIVE         2230653.79 
       C.E.O.          1893931.11 

答えて

1

のように見えますあなたは申し込みをしています。 は、簡単な例を見てみましょう:あなたは、各グループが渡さなっている見ることができるように

def print_group(group): 
    print(group) 
    print('=' * 10) 

grouped.apply(print_group) 
    col1 col2 value 
0  1 a  1 
1  1 b  2 
2  1 a  3 
3  1 b  4 
========== 
    col1 col2 value 
0  1 a  1 
1  1 b  2 
2  1 a  3 
3  1 b  4 
========== 
    col1 col2 value 
4  2 a  5 
5  2 b  6 
6  2 a  7 
7  2 b  8 
========== 

import pandas as pd 
df = pd.DataFrame({'col1': [1,1,1,1,2,2,2,2], 
        'col2': ['a','b','a','b','a','b','a','b'], 
        'value': [1,2,3,4,5,6,7,8]}) 
grouped = df.groupby('col1') 

は、今度は私たちが関数に渡さなっているものを確認することができます簡単な関数を作成してみましょう別のデータフレームとしての機能もちろん、すべての通常の関数をこのサブセットに適用することができます。 最初のグループが2回見えるという事実は、内部的な理由によるもので、変更できません。バグではありません。

のは、証拠にこれを別の関数を作成してみましょう:

def second_group_sum(group): 
    res = group.groupby('col2').value.sum() 
    print(res) 
    print('=' * 10) 
    return res 

grouped.apply(second_group_sum) 
col2 
a 4 
b 6 
Name: value, dtype: int64 
========== 
col2 
a 4 
b 6 
Name: value, dtype: int64 
========== 
col2 
a 12 
b 14 
Name: value, dtype: int64 
========== 

あなたはさらに行くことができるとなどなど、グループに適用-グループに適用-グループ適用されます...

私はこれが役に立てば幸い何が起こっているのか少し分かります。

ところで、ipdb(デバッグツール)を使用すると、適用された関数のブレークポイントをグループデータフレームとやりとりすることができます。

+0

ありがとうございましたJan!だから私はこれを確かめるために。 上記で定義したグループ化された変数は、DataFrameGroupByオブジェクトです。しかし、apply関数が実行すると、DataFrameのように動作します。これは、second_group_sumの場合と同様に、セカンダリグループを実行するためのものです。 –

+0

はい、 'grouped'は' DataFrameGroupBy'オブジェクトです。また、 'apply(function)'を使うと、根底にあるDataFrameを各グループごとに複数のDataFramesに分割することができます。 –

関連する問題