我确信这已在某处得到解答,但查询它有点棘手。
我有一个dict,其结构为ID字段,然后是1对键值对 例如:
{ '123' : {'name': 'Joe', 'age': '17 },
'888' : {'name': 'Cheryl', 'hometown': 'Liverpool'},
'432' : {'name': 'Raj'}
}
我想把它变成一个结构为三列的SQL表:id | property-name | property-value,例如:
123 | name | Joe
123 | age | 17
888 | name | Cheryl
888 | hometown | Liverpool
432 | name | Raj
我的计划是通过一个pandas DataFrame,然后是to_sql它。问题是从dict创建一个数据帧尝试使ID列标题和每个可能的属性名称成行。
问题1:唯一的方法是将我的dict转换为3-col数据帧以循环遍历它,将值附加到三个数组?
问题2:是否有必要经历大熊猫?使用sqlalchemy并填写INSERT查询会更好吗?
答案 0 :(得分:1)
您可以使用Series
pd.Series(d).apply(pd.Series).stack().reset_index()
Out[206]:
level_0 level_1 0
0 123 age 17
1 123 name Joe
2 432 name Raj
3 888 hometown Liverpool
4 888 name Cheryl
答案 1 :(得分:1)
d = { '123' : {'name': 'Joe', 'age': '17'},
'888' : {'name': 'Cheryl', 'hometown': 'Liverpool'},
'432' : {'name': 'Raj'}
}
df = pd.DataFrame.from_dict(d, orient = 'index').unstack().reset_index()
df
level_0 level_1 0
0 name 123 Joe
1 name 432 Raj
2 name 888 Cheryl
3 age 123 17
4 age 432 NaN
5 age 888 NaN
6 hometown 123 NaN
7 hometown 432 NaN
8 hometown 888 Liverpool
如果您想删除NaN,只需将.dropna()
添加到语句的末尾。
df = pd.DataFrame.from_dict(d, orient = 'index').unstack().reset_index().dropna()
df
level_0 level_1 0
0 name 123 Joe
1 name 432 Raj
2 name 888 Cheryl
3 age 123 17
8 hometown 888 Liverpool