【问题标题】:How to add a column value to another column's dictionary using python , pandas如何使用 python、pandas 将列值添加到另一列的字典中
【发布时间】:2019-09-01 19:23:50
【问题描述】:

我有一列“数据”,其中包含 json 对象作为值。我想在嵌套的 json 中添加一个键值对

source = {'my_dict':[{'_id': 'SE-DATA-BB3A'},{'_id': 'SE-DATA-BB3E'},{'_id': 'SE-DATA-BB3F'}],  'data': [ {'bb3a_bmls':[{'name': 'WAG 01', 'id': '105F', 'state': 'available', 'nodes': 3,'volumes-': [{'state': 'available', 'id': '330172', 'name': 'q_-4144d4e'}, {'state': 'available', 'id': '275192', 'name': 'p_3089d821ae', }]}]}
, {'bb3b_bmls':[{'name': 'FEC 01', 'id': '382E', 'state': 'available', 'nodes': 4,'volumes': [{'state': 'unavailable', 'id': '830172', 'name': 'w_-4144d4e'}, {'state': 'unavailable', 'id': '223192', 'name': 'g_3089d821ae', }]}]}
, {'bb3c_bmls':[{'name': 'ASD 01', 'id': '303F', 'state': 'available', 'nodes': 6,'volumes': [{'state': 'unavailable', 'id': '930172', 'name': 'e_-4144d4e'}, {'state': 'unavailable', 'id': '245192', 'name': 'h_3089d821ae', }]}]}
] }

input_df = pd.DataFrame(source)

input_df 如下所示:

现在我需要将“my_dict”列值添加为“data”列的嵌套 json 值中的第一个元素

我的目标数据框应如下所示(我已用粗体突出显示更改)

我厌倦了使用 dict.update() 但它似乎没有帮助。我被困在这里,不知道如何推进。感谢您的帮助。

【问题讨论】:

    标签: python json python-3.x pandas


    【解决方案1】:

    我看不出把它作为数据框有什么好处,如果你保留原来的字典,那么下面的循环就可以了,

    my_dict=[{'_id': 'SE-DATA-BB3A'},{'_id': 'SE-DATA-BB3E'},{'_id': 'SE-DATA-BB3F'}]
    
    
    data = [ {'bb3a_bmls':[{'name': 'WAG 01', 'id': '105F', 'state': 'available', 'nodes': 3,'volumes-': [{'state': 'available', 'id': '330172', 'name': 'q_-4144d4e'}, {'state': 'available', 'id': '275192', 'name': 'p_3089d821ae', }]}]}
    , {'bb3b_bmls':[{'name': 'FEC 01', 'id': '382E', 'state': 'available', 'nodes': 4,'volumes': [{'state': 'unavailable', 'id': '830172', 'name': 'w_-4144d4e'}, {'state': 'unavailable', 'id': '223192', 'name': 'g_3089d821ae', }]}]}
    , {'bb3c_bmls':[{'name': 'ASD 01', 'id': '303F', 'state': 'available', 'nodes': 6,'volumes': [{'state': 'unavailable', 'id': '930172', 'name': 'e_-4144d4e'}, {'state': 'unavailable', 'id': '245192', 'name': 'h_3089d821ae', }]}]}
    ] 
    
    
    for idx, val in enumerate(data):
        val[list(val.keys())[0]][0].update(my_dict[idx])
    

    【讨论】:

    • 感谢马克的回复。它适用于此示例数据。但是,如果我将它应用于大数据,我会收到一个错误 - “IndexError: list index out of range”。此外,数据值之一是 {'bb3b_pasf': []} 。会不会是因为这个?
    • @Tad 应该是这个原因,如果是[]就加个条件
    • 你能帮我解决这个问题吗?
    【解决方案2】:
    def get_val(row):
      my_dict_val = row.loc['my_dict']
      dict_key = list(row['data'].keys())[0]
      if not list(row['data'].values())[0]:
        return row['data']
      data_dict = list(row['data'].values())[0][0]
      data_dict.update(my_dict_val)
      res = dict()
      res[dict_key] = []
      res[dict_key].append(data_dict)
      return res
    
    input_df['data'] = input_df.apply(get_val, axis=1)
    

    【讨论】:

    • 感谢您的回复。实际上我需要字典中列表[]中的值
    • 谢谢贾巴拉!它适用于此示例数据。但是,如果我将它应用于大数据,我会收到一个错误 - “IndexError: list index out of range”。因为,其中一个数据值是 {'bb3b_pasf': []} 。我想添加一个条件来检查数据字典的值是否为空,以便该函数可以应用于具有值的字典
    • 我查了,你可以试试
    • 现在我收到了这个错误:(文件“”,第 13 行,在 get_val data_dict = list(row['data'].values()) [0][0] KeyError: (0, '发生在索引 3')
    【解决方案3】:

    解决方法如下:

    def update_data(row):
        data_dict = row['data']
        for key in data_dict:
            data_dict.update(row.loc['my_dict'])
        return data_dict
    df['data'] = df.apply(update_data,axis=1) 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-11
      • 1970-01-01
      • 1970-01-01
      • 2017-04-22
      • 1970-01-01
      相关资源
      最近更新 更多