You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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']]

最终得到的结果与目标表一致:

NameABC
A-12
B1-2
C22-

内容的提问来源于stack exchange,提问作者Diana Bugrimova

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 17:18:26