2017-06-05 71 views
0

我有一个熊猫系列这样如何拆分Pandas字典?

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.在时间列中,将字符串转换为json 2.从该JSON中提取列表并将其放入列中。完成这2个步骤后,我可以在该页面上应用该解决方案。 – Winston

回答

1

您可以将字符串评估为字典,然后将列表转换为列。最后将新列与名称合并。

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