基于 Pandas 中类别列的成对值计数

Pairwise value counts based on category column in Pandas

我的数据集看起来像

每个数据集对应于聚类算法的输出。现在我想计算,任何一对名字同时出现的次数

示例:

John 和 Katie 这对搭档在所有数据集中同时出现,因此他们的得分为 3

Paul 和 Ruth 在 2 个数据集中同时出现,因此他们的得分为 2

预期输出:

我试过外连接,但代码似乎不起作用。

为了便于参考和避免因名称不同而导致的错误,我会先将三个数据帧连接成一个,这样它看起来像这样:

import pandas as pd

df = pd.DataFrame({'Name': ['John', 'Katie', 'Paul', 'Ruth', 'Emily', 'Monica'],
                   'Category1': ['A', 'A', 'B', 'B', 'C', 'C'],
                   'Category2': ['A', 'A', 'B', 'C', 'B', 'C'],
                   'Category3': ['A', 'A', 'A', 'A', 'B', 'B']})
df
    Name    Category1   Category2   Category3
0   John    A           A           A
1   Katie   A           A           A
2   Paul    B           B           A
3   Ruth    B           C           A
4   Emily   C           B           B
5   Monica  C           C           B

您可以使用 itertools 模块中的 combinations 函数来获取所有可能的名称对,以及相应的类别对。这在字典理解中最方便地完成,因此您可以直接从中创建一个新的数据框。

然后您只需计算每行中两个类别相同的类别对的数量。

from itertools import combinations

df_pairs = pd.DataFrame({col: combinations(df[col], 2) for col in df.columns})
df_pairs['Score'] = df_pairs.apply(lambda row: sum([int(pair[0] == pair[1])
                                                    for pair in row[1:]]), axis=1)
df_pairs
    Name            Category1   Category2   Category3   Score
0   (John, Katie)   (A, A)      (A, A)      (A, A)      3
1   (John, Paul)    (A, B)      (A, B)      (A, A)      1
2   (John, Ruth)    (A, B)      (A, C)      (A, A)      1
3   (John, Emily)   (A, C)      (A, B)      (A, B)      0
4   (John, Monica)  (A, C)      (A, C)      (A, B)      0
5   (Katie, Paul)   (A, B)      (A, B)      (A, A)      1
6   (Katie, Ruth)   (A, B)      (A, C)      (A, A)      1
7   (Katie, Emily)  (A, C)      (A, B)      (A, B)      0
8   (Katie, Monica) (A, C)      (A, C)      (A, B)      0
9   (Paul, Ruth)    (B, B)      (B, C)      (A, A)      2
10  (Paul, Emily)   (B, C)      (B, B)      (A, B)      1
11  (Paul, Monica)  (B, C)      (B, C)      (A, B)      0
12  (Ruth, Emily)   (B, C)      (C, B)      (A, B)      0
13  (Ruth, Monica)  (B, C)      (C, C)      (A, B)      1
14  (Emily, Monica) (C, C)      (B, C)      (B, B)      2