Python Pandas:计算交易数及多尺码交易数的问题求助
解决Pandas计算多尺码交易数量的错误问题
问题描述
使用Pandas处理包含WEBSHOP_ORDER、CLASS、USIM、USIM_DESC、SIZE、DEMAND_QTY列的DataFrame,需针对指定USIM计算两项指标:
- Transaction_Count:每个USIM对应的唯一
WEBSHOP_ORDER数量 - transaction_with_Multiple_Sizes:每个USIM中包含多种
SIZE的WEBSHOP_ORDER数量
原代码中transaction_with_Multiple_Sizes的计算逻辑错误,导致结果数值超过Transaction_Count,不符合逻辑。
原代码错误分析
原代码中使用lambda x: (x.duplicated() & x.notna()).sum()统计重复的USIM值,这完全偏离需求——我们需要的是同一USIM下,单个订单包含多种尺码的数量,而非USIM的重复次数。
修正方案
正确计算需分两步:
- 先按
USIM和WEBSHOP_ORDER分组,统计每个订单对应的唯一尺码数量 - 筛选出尺码数量大于1的订单,再按
USIM分组统计这些订单的数量,同时计算总唯一订单数
修正后的完整代码
import pandas as pd import numpy as np # 定义目标USIM列表 usims_of_interest = [2199603, 2199608, 2199611, 2199641, 2199642, 2199682, 2199692, 2199697, 2200982] # 生成随机测试数据 np.random.seed(0) size_choices = ['Small', 'Medium', 'Large'] df = pd.DataFrame({ 'WEBSHOP_ORDER': np.random.randint(1, 10001, 10000), 'CLASS': np.random.choice(['A', 'B', 'C'], 10000), 'USIM': np.random.choice(usims_of_interest, 10000), 'USIM_DESC': ['Product {}'.format(i) for i in np.random.randint(1, 10001, 10000)], 'SIZE': np.random.choice(size_choices, 10000), 'DEMAND_QTY': np.random.randint(1, 10, 10000) }) # 筛选目标USIM数据 filtered_df = df[df['USIM'].isin(usims_of_interest)] # 第一步:按USIM+WEBSHOP_ORDER分组,统计每个订单的唯一尺码数 order_size_count = filtered_df.groupby(['USIM', 'WEBSHOP_ORDER'])['SIZE'].nunique().reset_index(name='Size_Count') # 第二步:按USIM分组,计算两个指标 result = order_size_count.groupby('USIM').agg( Transaction_Count=('WEBSHOP_ORDER', 'nunique'), transaction_with_Multiple_Sizes=('Size_Count', lambda x: (x > 1).sum()) ).reset_index() print(result)
代码解释
- 第一步分组统计
SIZE的唯一值数量,直接判断每个订单是否包含多种尺码 - 第二步通过
(x > 1).sum()统计尺码数大于1的订单数量,确保结果不会超过Transaction_Count - 保留原需求中筛选指定USIM的逻辑,同时修正核心计算错误
内容的提问来源于stack exchange,提问作者sdave
相关产品推荐
相关产品推荐

