如何统计pandas DataFrame中两人在同一图像中的共同出现次数
两人同现次数统计实现方案
实现思路
- 按图片ID分组,提取每张图里出现的所有人物
- 对单张图的人物列表生成不重复的二元无序组合,保证(Bob, Mary)和(Mary, Bob)被识别为同一个组合
- 统计所有组合的出现频次,按需转换为三列结果或对称共现矩阵
完整代码
import pandas as pd from itertools import combinations # 示例数据构造 data = [[1, 'Mary'], [1, 'Bob'], [1, 'Susan'], [2, 'Bob'], [2, 'Joe'], [3, 'Isaac'], [4, 'Mary'], [4, 'Susan'], [5, 'Mary'], [5, 'Susan'], [5, 'Bob'], [5, 'Joe']] df = pd.DataFrame(data, columns=['image_id', 'name']) # 生成三列格式结果:name1、name2、count pair_series = df.groupby('image_id')['name'].apply(lambda x: list(combinations(sorted(x), 2))) pair_counts = pair_series.explode().value_counts().reset_index() pair_counts.columns = ['name_pair', 'count'] pair_counts[['name1', 'name2']] = pd.DataFrame(pair_counts['name_pair'].tolist(), index=pair_counts.index) result_triple = pair_counts[['name1', 'name2', 'count']].sort_values('count', ascending=False).reset_index(drop=True) print("三列格式结果:") print(result_triple) # 生成对称共现矩阵 pair_all = pd.concat([ result_triple.rename(columns={'name1':'row', 'name2':'col'}), result_triple.rename(columns={'name2':'row', 'name1':'col'}) ]) all_names = df['name'].unique() co_matrix = pd.crosstab(index=pair_all['row'], columns=pair_all['col'], values=pair_all['count'], aggfunc='sum').reindex(index=all_names, columns=all_names, fill_value=0) print("\n共现矩阵结果:") print(co_matrix)
输出示例
三列格式结果
name1 name2 count 0 Mary Susan 3 1 Bob Susan 2 2 Bob Joe 2 3 Mary Bob 2 4 Mary Joe 1 5 Susan Joe 1
共现矩阵结果
col Mary Bob Susan Joe Isaac row Mary 0 2 3 1 0 Bob 2 0 2 2 0 Susan 3 2 0 1 0 Joe 1 2 1 0 0 Isaac 0 0 0 0 0
内容的提问来源于stack exchange,提问作者DV82XL
相关产品推荐
相关产品推荐

