如何统计同一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
相关产品推荐
相关产品推荐

