如何使用Pandas根据更新数据批量修改大型数据库中的指定值?
高效实现指定客户商品数量的批量更新(Pandas)
针对你提到的大型数据库批量更新需求,首先说下你原代码的问题:customerlist是字符串列表,用i作为索引去取customerlist[i]会直接报错,而且循环遍历的方式对大型数据效率极低,完全没必要。
下面给两种实用的实现方法,根据你的场景选择:
方法一:长格式转换统一处理(适合批量多商品更新)
把宽格式的库存表转成长格式,和更新表合并后计算,再转回宽格式,适合需要统一处理加减逻辑的场景:
import pandas as pd # 初始化数据 df = pd.DataFrame({'customer' : ['customer1', 'customer2'], 'item1': [12, 13], 'item2' : [3, 28],'item3': [2, 1]}) df2 = pd.DataFrame({'customer' : ['customer1', 'customer2'], 'item?': ['item1', 'item1'], 'quantity' : [2, 5]}) # 1. 将库存表转为长格式(customer + item 作为唯一标识) df_long = df.melt(id_vars='customer', var_name='item', value_name='original_qty') # 2. 重命名更新表的item列,和长格式表合并 df2_clean = df2.rename(columns={'item?': 'item'}) merged_df = pd.merge(df_long, df2_clean, on=['customer', 'item'], how='left') # 3. 计算更新后的数量(加法改减法直接换运算符即可) merged_df['updated_qty'] = merged_df['original_qty'] + merged_df['quantity'].fillna(0) # 4. 转回宽格式恢复原结构 df_updated = merged_df.pivot(index='customer', columns='item', values='updated_qty').reset_index() df_updated.columns.name = None # 清理多余的列索引名 print(df_updated)
输出结果:
customer item1 item2 item3 0 customer1 14 3 2 1 customer2 18 28 1
方法二:直接定位赋值(大型数据首选,效率更高)
跳过格式转换,直接遍历更新表的每一行,定位库存表中对应的客户和商品列进行加减操作,避免全表操作,适合大型数据库:
import pandas as pd df = pd.DataFrame({'customer' : ['customer1', 'customer2'], 'item1': [12, 13], 'item2' : [3, 28],'item3': [2, 1]}) df2 = pd.DataFrame({'customer' : ['customer1', 'customer2'], 'item?': ['item1', 'item1'], 'quantity' : [2, 5]}) # 遍历更新表的每一行,精准更新对应位置 for _, row in df2.iterrows(): # 获取当前更新的客户、商品、数量变更值 target_customer = row['customer'] target_item = row['item?'] qty_change = row['quantity'] # 定位到库存表中对应的行和列,执行加法(减法替换为 -= 即可) df.loc[df['customer'] == target_customer, target_item] += qty_change print(df)
同样能得到你想要的结果,而且这种方法只对需要更新的单元格操作,在数据量很大时比方法一快很多。
内容的提问来源于stack exchange,提问作者kucb
相关产品推荐
相关产品推荐

