2017-06-05 4 views
0

私はそれがデータに来るとき、このパンダの辞書を分割する方法は?

pd.DataFrame({"name": ['John','Mary','Tommy'], 
       "time": ['"data": [{"t": "16:50"},{"t": "17:05"}]', 
         '"data": [{"t": "16:10"}, {"t": "17:11"}, {"t": "17:12"}]', 
         np.nan]}) 

のようなパンダシリーズは、今では、列の時間では、この

name            time 
0 John   "data": [{"t": "16:50"},{"t": "17:05"}] 
1 Mary "data": [{"t": "16:10"}, {"t": "17:11"}, {"t":... 
2 Tommy            NaN 

ようになります持っては(文字列形式の)辞書であり、それはリストが含まれています(最大3項目、時にはNaN)。最大リストサイズがわかっているので、私は以下のようにデータをフラット化したいと思います。

name time1 time2 time3 
0 John 16:50 17:05 NaN 
1 Mary 16:10 17:11 17:12 
2 Tommy NaN NaN NaN 

forループを使用する以外は、私はパンダのやり方でこれを行う方法がわかりません。前もって感謝します。

+0

可能な重複https://stackoverflow.com/questions/38231591/splitting-dictionary-list-inside-a-pandas-column-into -separate-columns) –

+0

ありがとう@AnubhavSingh。私もその1つを見ている。しかし私の時間列は文字列なので、私はパンダのオブジェクトを正しく取得できません。私は何が行われる必要があると思う1.時間の列では、JSON 2に文字列を変換します。そのJSONからリストを抽出し、それを列に入れます。この2つのステップが完了すると、そのページにソリューションを適用することができます。 – Winston

答えて

1

文字列をdictに評価し、リストを列に変換することができます。最後に、新しい列をnameにマージします。

pd.concat([data['name'], 
      data.time.apply(lambda x: eval('{'+x+'}')['data'] if pd.notnull(x) else np.nan)\ 
      .apply(pd.Series).applymap(lambda x: x['t'] if pd.notnull(x) else x)],axis=1)\ 
      .rename(columns={0:'time1',1:'time2',2:'time3'}) 
Out[567]: 
    name time1 time2 time3 
0 John 16:50 17:05 NaN 
1 Mary 16:10 17:11 17:12 
2 Tommy NaN NaN NaN 
[別々の列にパンダ列内の分割辞書/リスト](の
関連する問題