基于Pandas向空DataFrame添加并迭代新行以用于聚类
针对RFM_class分组聚类的实现方案
我最近刚好在处理类似的大规模数据RFM聚类场景,结合你的需求——125种RFM_class(范围111-555)、10000行测试样本,给你分享下我的实现思路和代码框架:
核心逻辑拆解
- 先初始化一个空的DataFrame,用来存放所有RFM_class的聚类结果
- 遍历每一种RFM_class取值,提取对应的数据子集
- 对每个子集单独执行聚类算法,生成
cluster_class列 - 将带聚类结果的子集追加到最终的结果DataFrame中
代码示例(Python)
假设我们用pandas处理数据,sklearn.cluster.KMeans做聚类(你可以替换成其他聚类算法,比如DBSCAN、层次聚类等):
import pandas as pd from sklearn.cluster import KMeans from sklearn.preprocessing import StandardScaler import itertools # 假设你的测试数据框是df_test,包含RFM_class列和聚类所需的特征列 df_test = pd.read_csv("your_test_data.csv") # 替换成你的数据加载方式 # 生成所有125种RFM_class取值(111到555,每位1-5) rfm_classes = [int(''.join(map(str, combo))) for combo in itertools.product(range(1,6), repeat=3)] # 初始化空结果DataFrame final_df = pd.DataFrame() # 遍历每个RFM_class for rfm in rfm_classes: # 提取当前RFM_class的子集 subset = df_test[df_test['RFM_class'] == rfm].copy() # 跳过样本量不足的子集(比如样本数<聚类数,这里假设聚类数设为3) if len(subset) < 3: subset['cluster_class'] = None # 标记无有效聚类结果 final_df = pd.concat([final_df, subset], ignore_index=True) continue # 选择聚类所需的特征列(替换成你实际用的特征,比如消费金额、频次等) features = subset[['feature1', 'feature2', 'feature3']] # 特征标准化(避免量纲差异影响聚类结果) scaler = StandardScaler() scaled_features = scaler.fit_transform(features) # 执行聚类(这里用KMeans,参数可根据需求调整) kmeans = KMeans(n_clusters=3, random_state=42) subset['cluster_class'] = kmeans.fit_predict(scaled_features) # 将结果追加到最终DataFrame final_df = pd.concat([final_df, subset], ignore_index=True) # 查看最终结果 print(final_df.head())
关键优化建议
- 效率提升:如果是全量数据,遍历125次可能有点慢,可以改用
groupby+apply的批量处理方式,代码更简洁高效:def cluster_func(group): if len(group) < 3: group['cluster_class'] = None return group features = group[['feature1', 'feature2', 'feature3']] scaler = StandardScaler() scaled_features = scaler.fit_transform(features) kmeans = KMeans(n_clusters=3, random_state=42) group['cluster_class'] = kmeans.fit_predict(scaled_features) return group final_df = df_test.groupby('RFM_class').apply(cluster_func).reset_index(drop=True) - 算法适配:如果部分RFM_class的样本分布稀疏,KMeans效果可能不好,可以换成不需要指定聚类数的DBSCAN算法;如果需要层次化分类,层次聚类会更合适。
内容的提问来源于stack exchange,提问作者user3292755
相关产品推荐
相关产品推荐

