【问题标题】:Update values of an array of dictionaries from a pandas dataframe从熊猫数据框中更新字典数组的值
【发布时间】:2023-02-25 02:32:58
【问题描述】:

我有一系列字典:

jsn = [{'ID' : '01', 'Item' : 'Apple', 'salesman' :'Johnny'},
       {'ID': '02', 'Item': 'carrot', 'salesman':'Patricia'}, 
       {'ID': '04', 'Item' : 'airplane', 'salesman' : 'Eddgard'}, 
       {'ID' : '05', 'item' : 'iron', 'salesman' : 'Bettany'}]

我也有这个数据框:

df1 = pd.DataFrame([["1", "apple"], ["2", "mango"], 
                    ["3", "melon"], ["4", "watermelon"], 
                    ["5", "strawberry"]],columns=["ID", "Item"])

我想根据 df1“项目”值更改 json 数组中的所有“项目”值。

我试过这种方法

for k in df1:
   for i in jsn1:
        i.update({'Item': f"{k}"})

但它没有像我预期的那样工作。

【问题讨论】:

  • 那是一个列表,而不是一个数组
  • 这些结构之间的 ID 不匹配

标签: python json pandas


【解决方案1】:

你可以这样做:

for dict_, item in zip(jsn,df1["Item"].values):
    dict_["Item"] = item

jsn

输出:

[{'ID': '01', 'Item': 'apple', 'salesman': 'Johnny'},
 {'ID': '02', 'Item': 'mango', 'salesman': 'Patricia'},
 {'ID': '04', 'Item': 'melon', 'salesman': 'Eddgard'},
 {'ID': '05', 'Item': 'watermelon', 'salesman': 'Bettany'}]

【讨论】:

  • 考虑到 4/04 ID,我认为“飞机”不应该变成“西瓜”,也许应该变成“西瓜”?
【解决方案2】:

您可以创建一个dict base df1。然后更新jsn中的每个dict,如下所示:

jsn = [{'ID' : '01', 'Item' : 'Apple', 'salesman' :'Johnny'},{'ID': '02', 'Item': 'carrot', 'salesman':'Patricia'}, {'ID': '04', 'Item' : 'airplane', 'salesman' : 'Eddgard'}, {'ID' : '05', 'Item' : 'iron', 'salesman' : 'Bettany'}]
df1 = pd.DataFrame( [["2", "mango"], ["3", "melon"], ["4", "watermelon"], ["5", "strawberry"]],columns=["ID", "Item"] )


dct = dict(zip(df1['ID'].astype(int), df1['Item']))
for j in jsn:
        j['Item'] = dct.get(int(j['ID']), j['Item'])
print(jsn)

[{'ID': '01', 'Item': 'Apple', 'salesman': 'Johnny'},
 {'ID': '02', 'Item': 'mango', 'salesman': 'Patricia'},
 {'ID': '04', 'Item': 'watermelon', 'salesman': 'Eddgard'},
 {'ID': '05', 'Item': 'strawberry', 'salesman': 'Bettany'}]

【讨论】:

    【解决方案3】:

    关于什么:

    ref = df1.set_index('ID')['Item']
    
    for d in jsn:
        d['Item'] = ref.get(int(d['ID']), d.setdefault('Item', None))
    

    更新jsn

    [{'ID': '01', 'Item': 'mango', 'salesman': 'Johnny'},
     {'ID': '02', 'Item': 'melon', 'salesman': 'Patricia'},
     {'ID': '04', 'Item': 'strawberry', 'salesman': 'Eddgard'},
     {'ID': '05', 'Item': 'iron', 'salesman': 'Bettany'}]
    

    【讨论】:

      【解决方案4】:

      尝试使用merge

      import pandas as pd
      
      df1 = pd.DataFrame( [["1", "apple"], ["2", "mango"], ["3", "melon"], ["4", "watermelon"], ["5", "strawberry"]],columns=["ID", "Item"] )
      jsn = [{'ID' : '01', 'Item' : 'Apple', 'salesman' :'Johnny'},{'ID': '02', 'Item': 'carrot', 'salesman':'Patricia'}, {'ID': '04', 'Item' : 'airplane', 'salesman' : 'Eddgard'}, {'ID' : '05', 'Item' : 'iron', 'salesman' : 'Bettany'}]
      df2 = pd.DataFrame(jsn)
      
      df1["Item"] = df1["Item"].str.lower()
      df2["Item"] = df2["Item"].str.lower()
      
      df1.merge(df2, how='left', on='Item')
      

      输出:

      ID_x 商品 ID_y 销售员 0 1 个苹果 01 约翰尼 1 2 芒果 NaN NaN 2 3 瓜 NaN NaN 3 4 西瓜 NaN NaN 4 5 草莓 NaN NaN

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-12
        • 2017-03-23
        • 2016-01-14
        • 2021-07-17
        • 2014-11-22
        相关资源
        最近更新 更多