如何用Python Pandas/Numpy对比价格列表,识别增删及价格变动项?
用Python的Pandas或Numpy对比商品列表差异
当然可以用Pandas或Numpy实现这个需求,以下是两种具体实现方案:
Pandas 实现方案
Pandas的DataFrame合并和索引操作能高效处理这类对比需求:
import pandas as pd # 定义原始数据 old_list = [["tomato", 10.5], ["lettuce", 9], ["onion", 8], ["cucumber", 5]] new_list = [["tomato", 7], ["onion", 8], ["cucumber", 5], ["potato", 9]] # 转换为DataFrame并将商品名设为索引 old_df = pd.DataFrame(old_list, columns=["item", "price"]).set_index("item") new_df = pd.DataFrame(new_list, columns=["item", "price"]).set_index("item") # 外连接合并两个DataFrame,区分新旧价格 merged_df = old_df.join(new_df, how="outer", lsuffix="_old", rsuffix="_new") # 识别各类差异 added_items = merged_df[merged_df["price_old"].isna()].index.tolist() removed_items = merged_df[merged_df["price_new"].isna()].index.tolist() price_changed_items = merged_df[ merged_df["price_old"].notna() & merged_df["price_new"].notna() & (merged_df["price_old"] != merged_df["price_new"]) ].index.tolist() # 输出结果 print("新增商品:", added_items) print("删除商品:", removed_items) for item in price_changed_items: print(f"{item}价格从{merged_df.loc[item, 'price_old']}变为{merged_df.loc[item, 'price_new']}")
逻辑说明
- 将列表转成DataFrame后,用商品名作为索引,方便后续匹配
- 通过外连接合并两个表,保留所有商品的新旧价格信息
- 利用
isna()判断新增(旧价格为空)和删除(新价格为空)的商品 - 筛选出新旧价格都存在且不相等的商品,即为价格变动项
Numpy 实现方案
Numpy可以通过结构化数组处理混合类型数据,结合集合运算完成对比:
import numpy as np # 定义原始数据 old_list = [["tomato", 10.5], ["lettuce", 9], ["onion", 8], ["cucumber", 5]] new_list = [["tomato", 7], ["onion", 8], ["cucumber", 5], ["potato", 9]] # 转换为结构化数组(支持字符串和数值混合类型) old_arr = np.array(old_list, dtype=[('item', 'U20'), ('price', 'f8')]) new_arr = np.array(new_list, dtype=[('item', 'U20'), ('price', 'f8')]) # 提取商品名字段 old_items = old_arr['item'] new_items = new_arr['item'] # 识别新增和删除商品(利用集合差集) added_items = np.setdiff1d(new_items, old_items).tolist() removed_items = np.setdiff1d(old_items, new_items).tolist() # 识别价格变动商品 common_items = np.intersect1d(old_items, new_items) price_changed = [] for item in common_items: old_price = old_arr[old_arr['item'] == item]['price'][0] new_price = new_arr[new_arr['item'] == item]['price'][0] if old_price != new_price: price_changed.append((item, old_price, new_price)) # 输出结果 print("新增商品:", added_items) print("删除商品:", removed_items) for item, old_p, new_p in price_changed: print(f"{item}价格从{old_p}变为{new_p}")
逻辑说明
- 用结构化数组处理字符串+数值的混合数据类型
- 通过
np.setdiff1d计算集合差集,快速找出新增/删除的商品 - 遍历两个列表的公共商品,对比价格找出变动项
内容的提问来源于stack exchange,提问作者Equis User
相关产品推荐
相关产品推荐

