【问题标题】:Adding to a nested Dictionary in a Column in Pandas在 Pandas 的列中添加嵌套字典
【发布时间】:2021-06-13 16:23:50
【问题描述】:

所以,我有一个有趣的问题。我有一些数据有一个有趣的嵌套字典,我需要对其进行操作,但是遇到了麻烦。我可以在纯 python 中完成,但想在 Pandas 中完成整个解决方案,以使代码更简洁,而不必在其他地方重新打开相同的文件。

数据框:

Id             Timezone             Data
957643         Pacific             {"California":{"city":"San Francisco","pop":"874961"}}
973472         Eastern             {"New York":{"city":"New York","pop":"8419000"}}

所需的输出,一个字典列表,将 Id 和 Timezone 放入嵌套字典中,同时将它们包装在另一个键中,这样我就可以输出为 JSON:

[{"State Date":{"California":{"City":"San Francisco","Population":"874961","Id":"957643","Timezone":"Pacific"}}}, {"State Date":"New York":{"City":"New York","Population":"8419000", "Id":"973472","Timezone":"Eastern"}}}]

问题是,为了在其他地方提取最终数据格式,我需要将 Timezone 和 Id 放入要导出到 JSON 的每一行的嵌套部分中,并重命名一些字段。我已经尝试过 iterrows 方法并应用轴为 1,但它最终将所有 Id 和时区放入每个字典中,尽管它确实嵌套了它们。

在读取整个 CSV 时,下面的变体在纯 python 中有效,但在 Pandas 中无效(原因对大多数人来说可能很明显)。为简洁起见,这些是我感兴趣的行,所以我放弃了其他行。

output = []
entry = {}

for id_, time, data in the_states.iterrows():
        for state, other in data.items():
            entry['Id'] = id_
            entry['City'] = data.get('city')
            entry['Timezone'] = time
            entry['Population'] = data.get('pop')
            output.append({'State Data': entry})

任何帮助将不胜感激。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    一种方式:

    1. 通过to_dict('records') 创建另一个list of dict
    2. zipiteratelist of dict 之上。
    3. Update 第一个与另一个获得所需的JSON
    result = []
    for i,j in zip(df.Data,df[['Id', 'Timezone']].to_dict('records')):
        for key in i.keys():
            i[key] = {**i[key], **j}
        result.append({'state_data': i})
    

    输出:

    [{'state_data': {'California': {'city': 'San Francisco',
        'pop': '874961',
        'Id': 957643,
        'Timezone': 'Pacific'}}},
     {'state_data': {'New York': {'city': 'New York',
        'pop': '8419000',
        'Id': 973472,
        'Timezone': 'Eastern'}}}]
    
    完整示例:
    df = pd.DataFrame({'Id': {0: 957643, 1: 973472},
     'Timezone': {0: 'Pacific', 1: 'Eastern'},
     'Data': {0: {"California":{"city":"San Francisco","pop":"874961"}},
      1: {"New York":{"city":"New York","pop":"8419000"}}}})
    
    result = []
    for i,j in zip(df.Data,df[['Id', 'Timezone']].to_dict('records')):
        for key in i.keys():
            i[key] = {**i[key], **j}
        result.append({'state_data': i})
    

    【讨论】:

      猜你喜欢
      • 2016-07-24
      • 1970-01-01
      • 2020-01-21
      • 2023-04-02
      • 2017-12-26
      • 2022-08-15
      • 1970-01-01
      • 1970-01-01
      • 2018-04-25
      相关资源
      最近更新 更多