You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的重复次数。

修正方案

正确计算需分两步:

  1. 先按USIM和WEBSHOP_ORDER分组,统计每个订单对应的唯一尺码数量
  2. 筛选出尺码数量大于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 08:10:20