Python行迭代实现:标记库存增加周数的双重迭代需求
解决商品库存周增长标记的双重迭代问题
嘿,作为Python新手碰到这种需要先按商品遍历、再按周遍历的需求确实容易懵,我来一步步帮你搞定这个库存增长标记的任务!
先明确需求和数据样例
首先咱们对齐下需求:
- 先按商品编号分组,把同一个商品的所有周数据放在一起
- 对每个商品的周数据,从第二周开始,对比当前周和上周的库存:如果当前周库存 > 上周,标记为1;否则标记为0(第一周因为没有上周数据,默认标记0)
假设你的原始数据样例是这样的(模拟表格形式):
| 商品编号 | 周数 | 库存 |
|---|---|---|
| A001 | 1 | 100 |
| A001 | 2 | 150 |
| A001 | 3 | 140 |
| A002 | 1 | 80 |
| A002 | 2 | 80 |
| A002 | 3 | 90 |
期望的输出样例会新增一列标记:
| 商品编号 | 周数 | 库存 | 库存增加标记 |
|---|---|---|---|
| A001 | 1 | 100 | 0 |
| A001 | 2 | 150 | 1 |
| A001 | 3 | 140 | 0 |
| A002 | 1 | 80 | 0 |
| A002 | 2 | 80 | 0 |
| A002 | 3 | 90 | 1 |
方法一:纯Python基础实现(适合理解双重迭代逻辑)
这个方法不用额外库,帮你彻底搞懂“先遍历商品、再遍历周数”的双重迭代逻辑:
# 模拟你的原始数据,每个元素是(商品编号, 周数, 库存) inventory_data = [ ("A001", 1, 100), ("A001", 2, 150), ("A001", 3, 140), ("A002", 1, 80), ("A002", 2, 80), ("A002", 3, 90), ] # 第一步:按商品编号分组,把同一个商品的周数据收集到一起 grouped_products = {} for item in inventory_data: product_id, week, stock = item # 如果商品还没在分组字典里,先创建一个空列表 if product_id not in grouped_products: grouped_products[product_id] = [] # 把当前周的数据加入对应商品的列表 grouped_products[product_id].append((week, stock)) # 重要!确保每个商品的周数据是按周数从小到大排序的(防止原始数据乱序) for product_id in grouped_products: grouped_products[product_id].sort(key=lambda x: x[0]) # 第二步:双重迭代生成标记 final_result = [] # 第一层迭代:遍历每个商品 for product_id, weekly_stocks in grouped_products.items(): # 处理第一个周:没有上周数据,标记为0 first_week, first_stock = weekly_stocks[0] final_result.append((product_id, first_week, first_stock, 0)) # 第二层迭代:从第二个周开始,和上周库存对比 for i in range(1, len(weekly_stocks)): current_week, current_stock = weekly_stocks[i] last_week, last_stock = weekly_stocks[i-1] # 判断库存是否增长,生成标记 increase_flag = 1 if current_stock > last_stock else 0 final_result.append((product_id, current_week, current_stock, increase_flag)) # 打印结果 for row in final_result: print(row)
运行后会输出:
('A001', 1, 100, 0) ('A001', 2, 150, 1) ('A001', 3, 140, 0) ('A002', 1, 80, 0) ('A002', 2, 80, 0) ('A002', 3, 90, 1)
方法二:用Pandas高效实现(适合处理大量数据)
如果你的数据量比较大,用Pandas会更简洁高效,也是实际工作中常用的方式:
import pandas as pd # 把原始数据转成DataFrame(模拟你的表格数据) df = pd.DataFrame({ "商品编号": ["A001", "A001", "A001", "A002", "A002", "A002"], "周数": [1, 2, 3, 1, 2, 3], "库存": [100, 150, 140, 80, 80, 90] }) # 核心操作:按商品分组,计算库存的周差值,然后生成标记 df["库存增加标记"] = ( df.groupby("商品编号")["库存"] # 按商品分组 .diff() # 计算当前周和上周的库存差值 .fillna(0) # 第一周的差值是NaN,填充为0 .apply(lambda x: 1 if x > 0 else 0) # 差值>0标记1,否则0 ) # 查看最终结果 print(df)
运行后会直接得到带标记列的表格,和咱们期望的输出样例完全一致。
新手注意事项
- 一定要保证周数据有序:不管用哪种方法,都要确保同一个商品的周数是按从小到大排列的,不然对比的就不是“上周”了,结果会出错!
- 第一周的标记规则:如果你的需求里第一周需要特殊处理(比如标记为NaN或者其他值),可以直接修改代码里的对应部分。
内容的提问来源于stack exchange,提问作者SK Singh
相关产品推荐
相关产品推荐

