如何编写代码将符合调价条件的商品数据同步至Sheet B?
用Python Pandas实现Excel商品价格筛选与追加
我来分享一个用Python Pandas库实现需求的方案,这个库处理表格数据非常顺手,能轻松完成数据比对、筛选和写入操作。
实现步骤说明
首先我们需要把零散的new_price数组转换成结构化的表格,然后和Sheet A的原价做关联,接着判断涨幅条件,最后把符合要求的商品追加到Sheet B中。
完整代码示例
import pandas as pd from openpyxl import load_workbook # 1. 定义给定的新价格数组 new_price = [{"a": 1.5}, {"b": 2.1}, {"c": 3.6}] # 2. 将new_price数组转换为DataFrame(结构化表格) # 先把数组拆成(item, new_price)的元组列表,再转成DataFrame new_price_list = [(k, v) for item in new_price for k, v in item.items()] new_price_df = pd.DataFrame(new_price_list, columns=["item", "new_price"]) # 3. 读取Excel文件中的Sheet A和Sheet B # 假设Excel文件名为products.xlsx,根据实际文件名修改 excel_file = "products.xlsx" sheet_a_df = pd.read_excel(excel_file, sheet_name="Sheet A") sheet_b_df = pd.read_excel(excel_file, sheet_name="Sheet B") # 4. 合并Sheet A和new_price的数据,关联商品item merged_df = pd.merge(sheet_a_df, new_price_df, on="item", how="inner") # 5. 筛选符合条件的商品:涨幅≥20% 且 不在Sheet B中 # 计算涨幅比例 merged_df["price_increase_ratio"] = (merged_df["new_price"] - merged_df["old_price"]) / merged_df["old_price"] # 筛选条件 condition = (merged_df["price_increase_ratio"] >= 0.2) & (~merged_df["item"].isin(sheet_b_df["item"])) filtered_items = merged_df[condition][["item", "new_price"]] # 6. 将筛选出的商品追加到Sheet B中 updated_sheet_b = pd.concat([sheet_b_df, filtered_items], ignore_index=True) # 7. 将更新后的Sheet B写回Excel文件 # 使用openpyxl引擎来保留原文件的其他工作表 with pd.ExcelWriter(excel_file, engine="openpyxl", mode="a", if_sheet_exists="replace") as writer: updated_sheet_b.to_excel(writer, sheet_name="Sheet B", index=False) print("Sheet B已更新,结果符合预期!")
代码逻辑解释
- 数组转DataFrame:把原来的字典数组转换成标准的表格结构,方便后续和Excel表格做关联操作。
- 数据合并:通过
item列关联Sheet A的原价和新价格数组,这样能直接计算每个商品的涨幅。 - 条件筛选:
- 计算涨幅比例:
(新价-原价)/原价,判断是否≥20%; - 用
isin方法判断商品是否已经存在于Sheet B中,取反得到不在Sheet B的商品;
- 计算涨幅比例:
- 追加写入:用
concat合并原有Sheet B数据和筛选出的新数据,然后用ExcelWriter写回Excel,注意使用replace模式来覆盖原Sheet B,同时保留其他工作表。
验证结果
执行代码后,Sheet B的数据会变成:
| item | new_price |
|---|---|
| c | 3.6 |
| a | 1.5 |
完全符合预期:商品a的涨幅为50%(≥20%)且不在原Sheet B中,所以被追加;商品b涨幅仅5%,不符合条件;商品c已存在于Sheet B,不会重复添加。
内容的提问来源于stack exchange,提问作者Kingzton Lee
相关产品推荐
相关产品推荐

