如何用pandas计算交叉列间的唯一ID数量(类透视表需求)
实现Name交叉唯一id计数的Pandas方案
首先构造原始数据:
import pandas as pd data = { 'id': [1,2,2,2,3,3,4,4], 'Name': ['A','A','B','C','B','C','C','A'] } df = pd.DataFrame(data)
步骤1:生成每个id对应的Name集合
按id分组,收集每个id关联的所有Name:
id_names = df.groupby('id')['Name'].apply(set).reset_index()
步骤2:生成每个id的Name两两组合
对每个id的Name集合,生成有序的两两组合(保证A-B和B-A被视为同一组):
from itertools import combinations def get_name_pairs(names): return list(combinations(sorted(names), 2)) # sorted确保组合顺序统一 id_names['pairs'] = id_names['Name'].apply(get_name_pairs)
步骤3:展开组合并统计唯一id数量
将组合列拆分为行,再按Name对分组统计id的唯一数量:
pairs_df = id_names.explode('pairs').dropna() pairs_df[['Name1', 'Name2']] = pd.DataFrame(pairs_df['pairs'].tolist(), index=pairs_df.index) count_df = pairs_df.groupby(['Name1', 'Name2'])['id'].nunique().reset_index(name='count')
步骤4:构建对称透视表并处理格式
生成透视表后补全对称数据,替换对角线为'-':
# 生成基础透视表 pivot = count_df.pivot(index='Name1', columns='Name2', values='count').fillna(0).astype(int) # 合并转置数据补全对称部分 full_pivot = pivot.combine_first(pivot.T) # 设置行索引名称,替换对角线内容 full_pivot = full_pivot.rename_axis(index='Name', columns=None) for name in full_pivot.index: full_pivot.loc[name, name] = '-' # 固定列顺序为A、B、C full_pivot = full_pivot[['A', 'B', 'C']]
最终得到的结果与目标表一致:
| Name | A | B | C |
|---|---|---|---|
| A | - | 1 | 2 |
| B | 1 | - | 2 |
| C | 2 | 2 | - |
内容的提问来源于stack exchange,提问作者Diana Bugrimova
相关产品推荐
相关产品推荐

