如何在Pandas DataFrame中按USIM计算网店订单平均商品数
按USIM计算网店订单平均商品数量
原始数据
import pandas as pd data = { 'USIM': ['1111111', '2199608', '2222222', '4444444', '1111111', '2111111', '2222222', '4444444'], 'WEBSHOP_ORDER': [0, 0, 0, 0, 1, 1, 1, 1], 'DEMAND_QTY': [1, 3, 2, 1, 5, 9, 8, 6] } df = pd.DataFrame(data)
需求说明
按每个唯一的USIM计算对应的网店订单平均商品数量:
USIM为用户唯一标识符WEBSHOP_ORDER代表订单类型(0、1为两类不同订单)DEMAND_QTY是对应订单的商品数量
期望输出
USIM AVG_ITEMS_IN_WEBSHOP_ORDER 0 1111111 17.5 # (28+7)/2 * 1 2111111 28.0 2 2199608 7.0 3 2222222 17.5 4 4444444 17.5 # * 28是WEBSHOP_ORDER == 1时的全局总商品数 # 7是WEBSHOP_ORDER == 0时的全局总商品数
实现代码及逻辑
步骤1:计算两类订单的全局总商品数
先统计所有订单中,两类订单各自的总商品数量:
sum_order0 = df[df['WEBSHOP_ORDER'] == 0]['DEMAND_QTY'].sum() sum_order1 = df[df['WEBSHOP_ORDER'] == 1]['DEMAND_QTY'].sum()
步骤2:按USIM计算平均值
对每个USIM,统计它涉及的订单类型数量,再结合全局总商品数计算平均值:
# 按USIM和订单类型分组,标记该USIM是否拥有对应类型的订单 grouped = df.groupby(['USIM', 'WEBSHOP_ORDER']).size().unstack(fill_value=0) # 计算平均值:(涉及的订单类型总商品数之和) / 涉及的订单类型数量 grouped['AVG_ITEMS_IN_WEBSHOP_ORDER'] = ( grouped[0] * sum_order0 + grouped[1] * sum_order1 ) / (grouped[0] + grouped[1]) # 整理成目标格式 result = grouped[['AVG_ITEMS_IN_WEBSHOP_ORDER']].reset_index() print(result)
逻辑解释
- 先算出全局两类订单的总商品数:
sum_order0=7,sum_order1=28 - 分组后得到每个
USIM拥有的订单类型情况(比如1111111同时拥有0和1两类订单) - 平均值计算规则:若USIM涉及n种订单类型,就把对应类型的全局总商品数相加后除以n
- 最后重置索引,得到与期望一致的输出结构
运行结果
执行代码后输出:
USIM AVG_ITEMS_IN_WEBSHOP_ORDER 0 1111111 17.5 1 2111111 28.0 2 2199608 7.0 3 2222222 17.5 4 4444444 17.5
内容的提问来源于stack exchange,提问作者sdave
相关产品推荐
相关产品推荐

