如何在Pandas DataFrame中获取商品142累计销量达18时的日期?
问题描述
我是Python新手,手里有自动售货机的销售数据,想找出商品142售完18罐需要的天数。尝试遍历数据,想在累计销量达到18时获取对应的日期,但代码报错了。
样本数据
Day Hour of Day Item Trans Type Item Quantity Day of the Week 0 2024-04-01 01:00:00 110 Credit (EMV Contactless) 1 0 1 2024-04-01 01:00:00 133 Credit (EMV Contactless) 1 0 2 2024-04-01 09:00:00 123 Cash 1 0 3 2024-04-01 09:00:00 125 Cash 1 0 4 2024-04-01 09:00:00 137 Cash 1 0 5 2024-04-01 13:00:00 142 Cash 1 0 6 2024-04-01 19:00:00 140 Cash 1 0 7 2024-04-01 19:00:00 142 Cash 1 0 8 2024-04-01 19:00:00 143 Cash 1 0 9 2024-04-01 20:00:00 142 Cash 1 0
报错代码
for amt in april['Item Quantity']: if april['Item'] == 142: total += april['Item Quantity'] if total > 18: print(april.loc[amt, ['Day']]) break
错误原因分析
- 循环逻辑混乱:遍历的是单个销量值,但判断
april['Item'] == 142是对整列做比较,返回布尔数组,不是针对当前行的判断。 - 累计方式错误:
total += april['Item Quantity']是把整列销量都累加,不是只加商品142的销量。 - 索引使用错误:用销量值
amt当行索引,而DataFrame的索引是行号(如0、1、2...),会导致找不到对应行。 - 缩进语法错误:第二个
if语句缩进不对,Python对缩进敏感,直接引发语法报错。
解决方案
方法1:用Pandas内置函数(推荐)
先筛选商品142的记录,按日期排序后计算累计销量,再定位首次达到18罐的日期:
import pandas as pd # 假设数据已加载到april DataFrame中 # 筛选商品142的记录并按日期排序 item_142 = april[april['Item'] == 142].sort_values('Day') # 计算累计销量 item_142['Cumulative Quantity'] = item_142['Item Quantity'].cumsum() # 找到累计销量≥18的第一条记录的日期 target_day = item_142[item_142['Cumulative Quantity'] >= 18]['Day'].iloc[0] print(f"商品142售完18罐的日期是:{target_day}")
方法2:手动循环(适合新手理解逻辑)
total = 0 target_quantity = 18 # 按行遍历DataFrame for index, row in april.iterrows(): if row['Item'] == 142: total += row['Item Quantity'] if total >= target_quantity: print(f"商品142售完18罐的日期是:{row['Day']}") break
内容的提问来源于stack exchange,提问作者dakylesta
相关产品推荐
相关产品推荐

