基于Pandas DataFrame更新字典数组的Item值问题
问题分析与解决方案
你的代码逻辑存在两个核心问题:
for k in df1遍历的是DataFrame的列名(即"ID"和"Item"),而非行数据,导致你把字典的Item值更新成了列名,完全没用到df1里的实际商品数据。- 没有通过
ID建立匹配关系,只是盲目遍历所有字典条目更新,最终所有条目的Item都会被覆盖成最后一个列名。
正确实现步骤
要实现"根据ID匹配,用df1的Item值更新jsn对应条目"的需求,我们可以先把df1转换成ID到Item的映射字典(提高匹配效率),再遍历jsn数组完成更新,同时注意处理ID格式不统一、键名大小写不一致的问题。
完整代码示例
import pandas as pd 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"]) # 1. 统一ID格式:把df1的ID转为带前导0的两位字符串,和jsn的ID格式对齐 df1['ID'] = df1['ID'].str.zfill(2) # 2. 生成ID到Item的映射字典,方便快速查询 item_mapping = df1.set_index('ID')['Item'].to_dict() # 3. 遍历jsn数组,按ID匹配更新Item值 for entry in jsn: entry_id = entry['ID'] if entry_id in item_mapping: # 处理jsn中存在小写`item`键的情况,统一为大写`Item` if 'item' in entry: del entry['item'] entry['Item'] = item_mapping[entry_id]
代码说明
- 统一ID格式:jsn的ID是
"01"这类带前导0的字符串,df1的ID是"1"这类纯数字字符串,通过str.zfill(2)把df1的ID补成两位带前导0的格式,确保匹配准确。 - 映射字典:
set_index('ID')['Item'].to_dict()会生成类似{"01": "apple", "02": "mango"}的字典,后续查询效率远高于循环DataFrame。 - 处理键名大小写:jsn最后一个条目的键是小写
item,删除后统一用大写Item键,保证数据结构一致性。
内容的提问来源于stack exchange,提问作者matheusppedroso
相关产品推荐
相关产品推荐

