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

如何统计同一id中城市值的共现组合出现次数?

问题描述

现有如下DataFrame:

id      city
1       Swindon
1       Malmesbury
1       Kettering
2       Bath
2       Swindon
2       Salisbury
2       Kettering
3       Swindon
3       Kettering
3       Bath

需要统计city列中各城市在同一id下的共现情况,生成城市组合及其对应的出现次数,示例输出如下:

f                  t
Swindon/Kettering  3
Swindon/Bath       2
Swindon/Salisbury  1
Bath/Salisbury     1
...                ...
实现方法

可以用Pandas结合itertools.combinations来实现,具体步骤如下:

  • 按id分组,对每个分组内的city生成所有不重复的两两组合(组合为无序,比如Swindon/Bath和Bath/Swindon视为同一组合)
  • 收集所有分组的组合,统计每个组合的出现次数
  • 整理成要求的输出格式

具体代码如下:

import pandas as pd
from itertools import combinations

# 构造示例DataFrame
df = pd.DataFrame({
    'id': [1,1,1,2,2,2,2,3,3,3],
    'city': ['Swindon','Malmesbury','Kettering','Bath','Swindon','Salisbury','Kettering','Swindon','Kettering','Bath']
})

# 按id分组生成有序的两两组合(避免重复统计反向组合)
combinations_list = df.groupby('id')['city'].apply(lambda x: list(combinations(sorted(x), 2))).explode()

# 将组合转换为"/"分隔的字符串格式
combinations_str = combinations_list.apply(lambda x: '/'.join(x))

# 统计组合出现次数并整理结果
result = combinations_str.value_counts().reset_index()
result.columns = ['f', 't']

print(result)

代码说明

  • groupby('id')['city']:按id分组,提取每个分组的城市列表
  • combinations(sorted(x), 2):先对分组内的城市排序,再生成两两组合,确保反向组合格式统一,避免重复统计
  • explode():将分组后的组合列表展开为单行记录
  • value_counts():统计每个组合的出现频次
  • reset_index():将统计结果的索引转为列,并重命名列名为需求中的f和t

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 04:45:52