2017-05-23 15 views
1

私は3つのカラムを持つデータフレームを持っていますが、最初と2番目のカラムにgroupby関数を適用した後で辞書を作成したいと思います。それをするパンダの方法はありますか?pandas - データフレームでグループ化されたキー値ペアを作成する

DATAFRAME:コルX及びYコル上によりグループ化した後

Col X Col Y Sum 
A   a  3 
A   b  2 
A   c  1 
B   p  5 
B   q  6 
B   r  7 

:df.groupby([ 'コルX'、 'コルY'])合計()

    Sum 
Col X Col Y  
A   a  3 
      b  2 
      c  1 
B   p  5 
      q  6 
      r  7 

groupbyオブジェクトを介して反復しながら、辞書、私は

{A:{'a':3,'b':2,'c':1}, B:{'p':5,'q':6,'r':7}} 
+0

あなたは 'GROUPBY()'は必要ありません - '' df.set_index([ 'コルX'、 'コルYを'])うまくいくはずです。 – AChampion

+0

うん、それは働いた。おかげで:) – Abhishek

答えて

1

辞書理解を使って作成したい

{name: dict(zip(g['Col Y'], g['Sum'])) for name, g in df.groupby('Col X')} 

{'A': {'a': 3, 'b': 2, 'c': 1}, 'B': {'p': 5, 'q': 6, 'r': 7}} 

あなたがどこかにto_dictを使用して主張している場合、あなたはこのような何か行うことができます:

s = df.set_index(['Col X', 'Col Y']).Sum 
{k: s.xs(k).to_dict() for k in s.index.levels[0]} 

{'A': {'a': 3, 'b': 2, 'c': 1}, 'B': {'p': 5, 'q': 6, 'r': 7}} 

to_dict方法がちょうどボンネットの下にいくつかの理解を使用していることを、覚えておいてください。 orientオプションが提供する以上のものを必要とする特別なユースケースがある場合は、自分の理解を構築することには恥ずかしいことではありません。あなたがMultiIndexシリーズを反復処理することができます

+0

ありがとう、それは働いた。私たちがdf.to_dict()のようなことをすることができるかどうか疑問に思っていた。 – Abhishek

+0

@Abhishek私は自分の投稿を更新した。 – piRSquared

0
#A to_dict() solution 

d = df.groupby(['Col X','Col Y']).sum().reset_index().pivot(columns='Col X',values='Sum').to_dict() 

Out[70]: 
{'A': {0: 3.0, 1: 2.0, 2: 1.0, 3: nan, 4: nan, 5: nan}, 
'B': {0: nan, 1: nan, 2: nan, 3: 5.0, 4: 6.0, 5: 7.0}} 

#if you need to get rid of the nans: 
{k1:{k2:v2 for k2,v2 in v1.items() if pd.notnull(v2)} for k1,v1 in d.items()} 
Out[73]: {'A': {0: 3.0, 1: 2.0, 2: 1.0}, 'B': {3: 5.0, 4: 6.0, 5: 7.0}} 
1

>>> s = df.set_index(['ColX', 'ColY'])['Sum'] 
>>> {k: v.reset_index(level=0, drop=True).to_dict() for k, v in s.groupby(level=0)} 
{'A': {'a': 3, 'b': 2, 'c': 1}, 'B': {'p': 5, 'q': 6, 'r': 7}} 
関連する問題