【问题标题】:How to Nested dicts, lists & OrderedDicts to DataFrame如何将字典、列表和 OrderedDicts 嵌套到 DataFrame
【发布时间】:2021-06-17 16:43:06
【问题描述】:

如何解析以下数据结构:

data = {0: None,
     1: [OrderedDict([('N', '1192'),
                   ('Date', '2009-10-08T00:00:00'),
                   ('Rule', '0'),
                   ('N_Dip', '0'),
                   ('Leg',
                    OrderedDict([('Id', '33'),
                                 ('Name', 'Ports'),
                                 ('Type',
                                  OrderedDict([('Id', '2'),
                                               ('Name', 'Dip')]))])),
                   ('Id', '69')]),
      OrderedDict([('N', '382'),
                   ('Date', '2012-11-23T00:00:00'),
                   ('Rule', '0'),
                   ('N_Dip', '0'),
                   ('Leg',
                    OrderedDict([('Id', '33'),
                                 ('Name', 'Ports'),
                                 ('Type',
                                  OrderedDict([('Id', '2'),
                                               ('Name', 'Dip')]))])),
                   ('Id', '70')])],
     2: None,
     3: None,
     4: None,
     5: OrderedDict([('N', '5º'),
                  ('Article', '36º'),
                  ('Date', '0001-01-01T00:00:00'),
                  ('Rule', '0'),
                  ('N_Dip', '0'),
                  ('Leg',
                   OrderedDict([('Id', '7'),
                                ('Name', 'DEVA'),
                                ('Type',
                                 OrderedDict([('Id', '1'),
                                              ('Name', 'Code')]))])),
                  ('Id', '127')]),
     6: None,
     7: None}

到带有列的 pandas DataFrame(不一定按此顺序):

N | Date | Rule | N_Dip | Leg_Id | Leg_Name | Leg_Type | Leg_Type_Id | Leg_Type_Name | Leg_Type_Name | Id | Article

每个字典键(每个数字)在哪里变成一行?

所需输出示例:

  1. 我不知道如何在不使用多级索引的情况下解决此问题,但如果您有其他想法,请随意。

  2. 我不关心列的顺序。

提前致谢,

编辑:

  • 将“Nome”更正为“Name”(2021 年 6 月 18 日);
  • 添加了所需的输出 (18/06/2021)。

【问题讨论】:

    标签: python-3.x pandas dataframe data-structures nested


    【解决方案1】:

    如果data 是您的字典:

    df = pd.DataFrame(
        [l for v in data.values() for l in (v if isinstance(v, list) else [v]) if v]
    )
    x = df.pop("Leg").apply(pd.Series).add_prefix("Leg_")
    y = x.pop("Leg_Type").apply(pd.Series).add_prefix("Leg_Type_")
    
    out = pd.concat([df, x, y], axis=1)
    print(out)
    

    打印:

          N                 Date Rule N_Dip   Id Article Leg_Id Leg_Name Leg_Nome Leg_Type_Id Leg_Type_Nome Leg_Type_Name
    0  1192  2009-10-08T00:00:00    0     0   69     NaN     33    Ports      NaN           2           Dip           NaN
    1   382  2012-11-23T00:00:00    0     0   70     NaN     33      NaN    Ports           2           NaN           Dip
    2    5º  0001-01-01T00:00:00    0     0  127     36º      7     DEVA      NaN           1           NaN          Code
    

    【讨论】:

    • 感谢安德烈的帮助。一个很好的答案,但不完全是。请注意,它将 N 1192 和 N 382(或 Id 的 69 和 70)分成 2 行,而不是 1 行,并且删除了所有 Nan (行数应保持与外部 dict 的键相对应)。跨度>
    • @duarteharris 你能编辑你的问题并把预期的输出放在那里吗?
    • 是的 @andrej-kesely ,我在 :) 谢谢。
    • 添加了预期的输出。清楚吗?它有帮助吗?再次感谢您,
    【解决方案2】:

    利用@andrej-kesely 出色的列表理解能力后,我可能会使用json_normalize() 为我完成这项工作。请注意,在我的测试中,我假设“Name”和“Nome”之间存在拼写错误,因此我将它们都设为“Name”。

    import pandas
    data = [l for v in data.values() for l in (v if isinstance(v, list) else [v]) if v]
    print(pandas.json_normalize(data, sep="_"))
    

    给予:

          N                 Date Rule N_Dip   Id Leg_Id Leg_Name Leg_Type_Id Leg_Type_Name Article
    0  1192  2009-10-08T00:00:00    0     0   69     33    Ports           2           Dip     NaN
    1   382  2012-11-23T00:00:00    0     0   70     33    Ports           2           Dip     NaN
    2    5º  0001-01-01T00:00:00    0     0  127      7     DEVA           1          Code     36º
    

    【讨论】:

    • 谢谢乔恩。这很好,但并不完全。请注意,它将 N 1192 和 N 382(或 Id 的 69 和 70)分成 2 行,而不是 1 行,并且删除了所有 Nan (行数应保持与外部 dict 的键相对应)。跨度>
    猜你喜欢
    • 2019-06-27
    • 2017-12-26
    • 1970-01-01
    • 2019-05-01
    • 2021-02-18
    • 2018-10-26
    • 1970-01-01
    • 1970-01-01
    • 2016-07-24
    相关资源
    最近更新 更多