如何快速将大规模客户消费数据按月度区间分组
快速分组解决方案(R & Python)
核心思路
不用嵌套循环遍历所有可能的分组组合,而是为每个客户直接计算唯一的组ID:
- 先将每个月的消费金额映射为对应的分组编码(0-3,对应你定义的4个区间);
- 把12个月的编码看作一个4进制数,转换为十进制整数作为组ID(可加1让ID从1开始,匹配你的示例)。
这种方法是向量式操作,时间复杂度为O(n)(n为客户数),处理100万行数据毫无压力。
R 实现(推荐用data.table提升效率)
library(data.table) # 1. 定义分组编码函数 categorize_month <- function(x) { dplyr::case_when( x == 0 ~ 0, # 消费=0 x > 0 & x <= 25 ~ 1, # 0<金额≤25 x > 25 & x <= 50 ~ 2, #25<金额≤50 x > 50 & x <= 75 ~ 3, #50<金额≤75 TRUE ~ NA_integer_ # 处理超出范围的数值,可根据需求调整 ) } # 2. 加载并转换数据(假设你的数据列是id, m1到m12) dt <- as.data.table(your_data) # 替换为你的数据对象 month_cols <- paste0("m", 1:12) # 所有月份列名 # 3. 为每个月的金额编码 dt[, (month_cols) := lapply(.SD, categorize_month), .SDcols = month_cols] #4. 计算组ID:将12个编码视为4进制数,转换为十进制(加1让ID从1开始) powers_of_4 <- 4^(11:0) # 4^11到4^0,对应12个月的权重 dt[, group_id := as.matrix(.SD) %*% powers_of_4 + 1, .SDcols = month_cols]
如果偏好dplyr:
library(dplyr) your_data %>% mutate(across(starts_with("m"), categorize_month)) %>% mutate(group_id = as.matrix(select(., starts_with("m"))) %*% 4^(11:0) + 1)
Python 实现(用pandas)
import pandas as pd import numpy as np #1. 定义分组编码函数 def categorize_month(x): if x == 0: return 0 elif 0 < x <= 25: return 1 elif 25 < x <= 50: return 2 elif 50 < x <= 75: return 3 else: return np.nan # 处理超出范围的数值 #2. 加载数据(假设列是id, m1到m12) df = pd.read_csv("your_data.csv") # 替换为你的数据加载方式 month_cols = [f"m{i}" for i in range(1, 13)] #3. 为每个月的金额编码 df[month_cols] = df[month_cols].applymap(categorize_month) #4. 计算组ID:4进制转十进制,加1让ID从1开始 powers_of_4 = 4 ** np.arange(11, -1, -1) # 4^11到4^0的权重数组 df["group_id"] = (df[month_cols].values @ powers_of_4) + 1
说明
- 每个唯一的12月消费模式会对应唯一的
group_id,比如全年消费均为0的客户group_id=1,第一个月在0-25、其余为0的客户group_id=4^11 +1,完全符合你的分组逻辑。 - 向量式操作避免了嵌套循环的巨大开销,处理100万行数据仅需几秒。
内容的提问来源于stack exchange,提问作者Alberto Perez Martinez
相关产品推荐
相关产品推荐

