2016-08-28 11 views
1

値がコンマ区切りの文字列である入れ子の辞書からDataFrameを作成しようとしています。pandas:コンマで区切られたdictのデータフレーム

各値は、次のような、辞書にネストされている:私の所望の出力である

dict = {"1":{ 
      "event":"A, B, C"}, 
     "2":{ 
      "event":"D, B, A, C"}, 
     "3":{ 
      "event":"D, B, C"} 
     } 

A B C D 
0 A B C NaN 
1 A B C D 
2 NaN B C D 

私がこれまで持っているすべてのデータフレームに辞書を変換しての項目を分割され各リスト。しかし、私はこれが私の目的に一層近づいているとは確信していません。

df = pd.DataFrame(dict) 
Out[439]: 
      1   2  3 
event A, B, C D, B, A, C D, B, C 

In [441]: df.loc['event'].str.split(',').apply(pd.Series)                                             
Out[441]: 
    0 1 2 3 
1 A B C NaN 
2 D B A C 
3 D B C NaN 

助けていただければ幸いです。おかげ

+0

変数名としてキーワードを使用しないでください。 – Merlin

答えて

1

df1あなたは(余分なスペースを取り除くには少しスプリットを変更)したものから、することができますおそらくちょうどstack結果とインデックスと値の列にpd.crosstab()を使用します。

df1 = df.loc['event'].str.split('\s*,\s*').apply(pd.Series) 

df2 = df1.stack().rename('value').reset_index() 
pd.crosstab(df2.level_0, df2.value) 

# value A B C D 
# level_0    
#  1 1 1 1 0 
#  2 1 1 1 1 
#  3 0 1 1 1 

これではありませんあなたが求めているのとまったく同じですが、希望の出力にこれを好むかもしれないと思います。

まさにあなたが探しているものを取得するには、上記の値列に等しい余分な列を追加し、値が含まれているインデックススタックを解除することができます:あなたはのカップルを使用することができます

df2 = df1.stack().rename('value').reset_index() 
df2['value2'] = df2.value 
df2.set_index(['level_0', 'value']).drop('level_1', axis = 1).unstack(level = 1) 

#   value2 
# value A  B  C  D 
# level_0    
#  1 A  B  C None 
#  2 A  B  C  D 
#  3 None B  C  D 
+0

ありがとうPsidom、これはまさに私が欲しかったものです。そして、実際には、最初の数値バージョンは私のケースではさらに良く機能します:)。 Rgds。 –

2

を列のエントリが存在するかどうフラグデータフレームを作成するためのより良い形式にネストされた辞書をマッサージする内包表記:

the_dict = {"1":{ 
      "event":"A, B, C"}, 
     "2":{ 
      "event":"D, B, A, C"}, 
     "3":{ 
      "event":"D, B, C"} 
     } 

df = pd.DataFrame([[{z:1 for z in y.split(', ')} for y in x.values()][0] for x in the_dict.values()]) 
>>> df 

    A B C D 
0 1.0 1 1 NaN 
1 1.0 1 1 1.0 
2 NaN 1 1 1.0 

あなたがデータフレームを作ったら、あなたが列と変換を通じて単にループすることができますexiにフラグを立てた値(NaNのがNaNとして残すところこれがないの下に、それ以外の場合は、列の文字を挿入する)whereメソッドを使用して、文字への手紙のstence:@のマーリンの提案に基づいて

for col in df.columns: 
    df_mask = df[col].isnull() 
    df[col]=df[col].where(df_mask,col) 
>>> df 

    A B C D 
0 A B C NaN 
1 A B C D 
2 NaN B C D 

あなたは答えにまっすぐに行くことができます理解の範囲内:

df = pd.DataFrame([[{z:z for z in y.split(', ')} for y in x.values()][0] for x in the_dict.values()]) 
>>> df 
    A B C D 
0 A B C NaN 
1 A B C D 
2 NaN B C D 
+0

またはtry z:1 >>> z:z – Merlin

+0

この解決方法も有効です。ありがとう! –

関連する問題