【问题标题】:Convert a dict to three-column dataframe using ID/key/value使用 ID/key/value 将 dict 转换为三列数据框
【发布时间】:2018-05-04 03:58:52
【问题描述】:

我确信这已经在某个地方得到了回答,但是查询它有点棘手。

我有一个由 ID 字段和 1-many key-value 对构成的字典 例如:

{ '123' : {'name': 'Joe', 'age': '17 },
  '888' : {'name': 'Cheryl', 'hometown': 'Liverpool'},
  '432' : {'name': 'Raj'}
 }

我想把它放到一个结构为三列的 SQL 表中:id |属性名 |属性值,例如:

123 | name | Joe
123 | age  | 17
888 | name | Cheryl
888 | hometown | Liverpool
432 | name | Raj

我的计划是通过 pandas DataFrame,然后 to_sql 它。问题是从 dict 创建数据框试图使 IDs 列标题和每个可能的属性名称为一行。

问题 1:将我的 dict 转换为 3-col 数据框以循环遍历它,将值附加到三个数组的唯一方法是吗?

问题2:有必要通过pandas吗?只使用 sqlalchemy 并填写 INSERT 查询会更好吗?

【问题讨论】:

    标签: python pandas dictionary sqlalchemy


    【解决方案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
    

    【讨论】:

    • 太棒了!虽然在我的实际数据中有几十种属性类型(万岁用户生成的字段)。我需要担心任何性能问题吗?
    • 在处理此类数据时总是很有趣。我希望我有一个关于from_dict 与@Wen 答案的速度的答案。我会做一些研究,看看我是否能找到合适的答案
    【解决方案2】:

    您可以使用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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-27
      • 2019-08-08
      • 2014-04-23
      • 1970-01-01
      • 1970-01-01
      • 2015-03-22
      相关资源
      最近更新 更多