如何使用python,pandas将列值添加到另一列的字典中

时间:2019-09-01 19:23:50

标签: python json python-3.x pandas

我有一列“数据”,其中有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如下所示: enter image description here

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

我的目标数据框应如下图所示(我以粗体突出显示了更改) enter image description here

我厌倦了使用dict.update(),但似乎无济于事。我被困在这里,却不知道如何继续前进。感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

解决方案如下:

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) 

答案 1 :(得分:1)

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)

答案 2 :(得分: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])