如何获得Python中每个人最具共同特征的人的列表?

2024-09-29 23:24:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据框,看起来像(下面1表示有特征,0表示没有):

Person Trait_1 Trait_2 Trait_3 Trait_4   
A        1       1       1     1
B        0       1       1     0
C        0       1       0     0
D        1       1       0     1
E        0       0       0     1

我想要一个函数,为每个人返回具有最多共同特征的前10名

因此,对于人A,输出可以是:

D (3 traits), B (2 traits), C(1 trait), E(1 trait)

我认为有一个矩阵,它看起来像是编码每个人与其他人有多少共同点,这将是一个良好的开端:

   A  B  C  D  E
A  4  2  1  3  1
B  2  4  1  1  0
C  1  1  4  1  0  
D  3  1  1  4  1
E  1  0  0  1  4

但我不知道如何实现这一目标,也不知道这叫什么


Tags: 数据函数目标编码矩阵特征persontraits
3条回答

这更像是一个线性代数的答案,但如果你想知道人a和人B之间的共同特征的数量,你可以计算人a的线向量和人B的线向量的标量积(这只起作用,因为你的矩阵是二进制矩阵)

我不知道您使用的是什么框架/库,但如果您使用的是pandas,您可以轻松提取线向量并将其转换为numpy数组,然后进行标量积

尝试:

# if not done already
df.set_index("Person", inplace=True)

res = (df@df.T).stack().reset_index(level=1)

res = res.loc[res["Person"].ne(res.index) & res[0].gt(0)].sort_values(0, ascending=False).groupby(level=0).apply(lambda x: list(x.values))

产出:

>>> res

Person
A    [[D, 3], [B, 2], [C, 1], [E, 1]]
B            [[A, 2], [C, 1], [D, 1]]
C            [[A, 1], [B, 1], [D, 1]]
D    [[A, 3], [B, 1], [C, 1], [E, 1]]
E                    [[A, 1], [D, 1]]
dtype: object

和您的函数(结果按降序排列):

>>> res.loc['C']

[array(['A', 1], dtype=object), array(['B', 1], dtype=object), array(['D', 1], dtype=object)]
  1. 创建一个数据帧
import pandas as pd
df = pd.DataFrame(data=[[1, 1, 1, 1],
                        [0, 1, 1, 0],
                        [0, 1, 0, 0],
                        [1, 1, 0, 1],
                        [0, 0, 0, 1]],
                 index=['A', 'B', 'C', 'D', 'E',],
                 columns=['Trait_1', 'Trait_2', 'Trait_3', 'Trait_4'])
  1. 使用矩阵乘法创建常见特征的矩阵(您描述的)
common_traits = df @ df.T
  1. 为每个人打印你想要的字符串(最具共同特征的前10位人物)
n = 10
for index, row in common_traits.iterrows():
    top10 = row.drop(index).nlargest(n)
    top10 = top10[top10 > 0]
    string = ', '.join(top10.index + top10.map(lambda x: f' ({x} trait{"s" if x != 1 else ""})'))
    print(f'{index}: {string}')

输出

A: D (3 traits), B (2 traits), C (1 trait), E (1 trait)
B: A (2 traits), C (1 trait), D (1 trait)
C: A (1 trait), B (1 trait), D (1 trait)
D: A (3 traits), B (1 trait), C (1 trait), E (1 trait)
E: A (1 trait), D (1 trait)

相关问题 更多 >

    热门问题