如何跟踪Pandas聚类后DataFrame元素的原始call来源
解决Pandas中聚类后元素的原始来源跟踪问题
问题分析
原始DataFrame中的元素经聚类重新排列后,需精准跟踪每个元素对应的原始call列来源。难点在于同一值多列重复出现时,要匹配到正确的来源(而非所有来源或最后一次出现的来源)。
解决方案
核心逻辑是通过记录元素的出现顺序,将聚类后的元素与原始元素按「值+出现次数」一一对应,从而准确匹配来源列。
步骤说明
- 处理原始表:将宽表转为长格式,过滤空值后,为每个相同值添加出现次数编号,标记其为该值的第几次出现。
- 处理聚类表:对聚类后的表执行相同的长格式转换和出现次数标记,确保同一值的编号规则与原始表一致。
- 合并与格式化:以「值+出现次数」为键合并两个长表,获取每个聚类元素的原始来源列,格式化要求的
{来源列, 值}形式后,转换回宽表结构。
完整代码
import pandas as pd import numpy as np # 原始DataFrame df = pd.DataFrame({"call 1": ['debit card','bond',np.nan], "call 2": ['debit card','mortgage','spending limit'], "call 3":['payment limit','debit card',np.nan]}) # 聚类后的DataFrame dfc = pd.DataFrame( {'cluster 1': ['payment limit', 'spending limit',np.nan], 'cluster 2': ['debit card', 'debit card', 'debit card'], 'cluster 3': [ 'bond', 'mortgage',np.nan]}) # 处理原始表:转换为长格式并添加出现次数 df_long = df.unstack().reset_index() df_long.columns = ['source_col', 'row_idx', 'value'] df_long = df_long.dropna(subset=['value']) df_long['occurrence'] = df_long.groupby('value').cumcount() # 处理聚类表:转换为长格式并添加出现次数 dfc_long = dfc.unstack().reset_index() dfc_long.columns = ['cluster_col', 'row_idx', 'value'] dfc_long = dfc_long.dropna(subset=['value']) dfc_long['occurrence'] = dfc_long.groupby('value').cumcount() # 合并表并格式化内容 merged = pd.merge(dfc_long, df_long, on=['value', 'occurrence'], how='left') merged['formatted'] = merged.apply(lambda x: f"{{{x['source_col']}, {x['value']}}}", axis=1) # 转换回宽表并调整格式 result = merged.pivot(index='row_idx', columns='cluster_col', values='formatted') result = result[dfc.columns].reset_index(drop=True) result = result.where(pd.notna(result), np.nan) print(result)
输出结果
cluster 1 cluster 2 cluster 3 0 {call 3, payment limit} {call 1, debit card} {call 1, bond} 1 {call 2, spending limit} {call 2, debit card} {call 2, mortgage} 2 NaN {call 3, debit card} NaN
内容的提问来源于stack exchange,提问作者Wiliam
相关产品推荐
相关产品推荐

