使用ID /键/值

时间:2018-05-03 19:49:05

标签: python pandas dictionary sqlalchemy

我确信这已在某处得到解答,但查询它有点棘手。

我有一个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查询会更好吗?

2 个答案:

答案 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)

使用from_dict

执行此操作的另一种方法
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