我有以下格式的数据(每个字典包含 3 个列表的列表):
[{40258: [['2018-07-03T14:13:41'], ['Open'], ['Closed']]},
{40257: [['2018-07-03T13:47:55',
'2018-07-03T14:21:52',
'2018-07-04T11:56:44'],
['Open', 'In Progress', 'Waiting on 3rd Party'],
['In Progress', 'Waiting on 3rd Party', 'In Progress']]},
{40255: [['2018-07-03T13:12:58'], ['Open'], ['Closed']]},
{40250: [[], [], []]}]
我想将上面的转换成下面的 df:
key List1-1 List1-2 List1-3 List2-1 List2-2 List2-3 List3-1 List3-2 List3-3
40258 2018-07-03T14:13:41 nan nan 'Open' nan nan 'Closed' nan nan
40257 2018-07-03T13:47:55 2018-07-03T14:21:52 2018-07-04T11:56:44 'Open' 'In Progress' 'Waiting on 3rd Party' 'In Progress' 'Waiting on 3rd Party' 'In Progress'
40255 2018-07-03T13:12:58 nan nan 'Open' nan nan 'Closed' nan nan
40250 nan nan nan nan nan nan nan nan nan
- 每个键是一行,列表的每个元素是一列。
- 外层列表包含 50,000 个要组成行的字典。
- 始终恰好有 3 个内部列表。
- 内部列表的长度可变 - 从 0 到最大 25。
我已经尝试了普通的 pd.DataFrame
和 pd.DataFrame.from_dict
但我找不到处理字典中多个列表的解决方案。
非常感谢任何帮助。
最佳答案
data=[{40258: [['2018-07-03T14:13:41'], ['Open'], ['Closed']]},
{40257: [['2018-07-03T13:47:55',
'2018-07-03T14:21:52',
'2018-07-04T11:56:44'],
['Open', 'In Progress', 'Waiting on 3rd Party'],
['In Progress', 'Waiting on 3rd Party', 'In Progress']]},
{40255: [['2018-07-03T13:12:58'], ['Open'], ['Closed']]},
{40250: [[], [], []]}]
f = lambda x: x + [np.nan]*(3-len(x))
mod_data = [ [k]+ sum(list(map(f, v)), []) for d in data for k,v in d.items()]
cols = ['key', 'List1-1', 'List1-2', 'List1-3', 'List2-1', 'List2-2', 'List2-3', 'List3-1', 'List3-2', 'List3-3']
df = pd.DataFrame(mod_data, columns=cols).set_index('key')
print(df)
输出
List1-1 List1-2 List1-3 List2-1 List2-2 List2-3 List3-1 List3-2 List3-3
key
40258 2018-07-03T14:13:41 NaN NaN Open NaN NaN Closed NaN NaN
40257 2018-07-03T13:47:55 2018-07-03T14:21:52 2018-07-04T11:56:44 Open In Progress Waiting on 3rd Party In Progress Waiting on 3rd Party In Progress
40255 2018-07-03T13:12:58 NaN NaN Open NaN NaN Closed NaN NaN
40250 NaN NaN NaN NaN NaN NaN NaN NaN NaN
关于python - Pandas - 从字典列表创建 df,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51166473/