2017-09-01 10 views
2

私は基本的なパンダでなければならないことを知りたいと思っていますが、それを理解するために私の頭脳を磨いています。私は、各グループの割合および数は、グループBYSの任意のレベルのために利用できるようにしたい:pandas groupby数と割合

import pandas as pd 

df = pd.DataFrame({'A': [1, 0, 1, 0, 1, 0, 0, 0], 'B': ['A'] * 4 + ['B'] * 4}) 

gb = df.groupby(['A', 'B']).size() 

prop_gb = gb/gb.groupby(level=0).sum() 

prop_gbは今です:

prop_gb 
Out[116]: 
A B 
0 A 0.400000 
    B 0.600000 
1 A 0.666667 
    B 0.333333 
dtype: float64 

私は最終的にこれをしたい、しかし:

A B  prop count 
0 A 0.400000  2 
    B 0.600000  3 
1 A 0.666667  2 
    B 0.333333  1 

2つのpandas.Seriesオブジェクトをマージしようとしました。gbprop_gbを辞書に変換して「結合」しますが、

desired = {k: (v, prop_gb.to_dict()[k]) for k, v in gb.to_dict().items()} 
desired 
{(0, 'A'): (2, 0.40000000000000002), 
(0, 'B'): (3, 0.59999999999999998), 
(1, 'A'): (2, 0.66666666666666663), 
(1, 'B'): (1, 0.33333333333333331)} 

答えて

1

はあなただけで始まり、prop列を追加するデータフレームを作成するためにto_frameを使用することができます。これは技術的に私が欲しいものを達成し

...これを達成するためのネイティブパンダの方法が存在する必要があります知っています:

>>> desired = df.groupby(['A', 'B']).size().to_frame('count') 
>>> desired['prop'] = gb/gb.groupby(level=0).sum() 
>>> desired 
    count  prop 
A B     
0 A  2 0.400000 
    B  3 0.600000 
1 A  2 0.666667 
    B  1 0.333333 

オルタナティブ、2シリーズから新しいフレームを作成します。

>>> pd.DataFrame(dict(prop=prop_gb, count=gb)) 
    count  prop 
A B     
0 A  2 0.400000 
    B  3 0.600000 
1 A  2 0.666667 
    B  1 0.333333 
1

、連結方式、作成した2つのシリーズ:

df = pd.concat([prop_gb, gb], axis=1) 
df.columns = ['prop', 'count'] 

df 

     prop count 
A B 
0 A 0.400000 2 
    B 0.600000 3 
1 A 0.666667 2 
    B 0.333333 1 
1

あなたがそうのような一つの式でこれらの値を生成することが可能です。

df.groupby(['A', 'B']).size().agg(
    {'count': lambda x: x, 'prop':lambda x: x/x.sum(level=0)} 
).unstack(level=0).reset_index() 
# A B count  prop 
# 0 0 A 2.0 0.400000 
# 1 0 B 3.0 0.600000 
# 2 1 A 2.0 0.666667 
# 3 1 B 1.0 0.333333 
関連する問題