基于 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
我的数据集看起来像
每个数据集对应于聚类算法的输出。现在我想计算,任何一对名字同时出现的次数
示例:
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