Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 成对相似性_Python_Pandas - Fatal编程技术网

Python 成对相似性

Python 成对相似性,python,pandas,Python,Pandas,我有一个看起来像这样的数据框: df = pd.DataFrame({'name': [0, 1, 2, 3], 'cards': [['A', 'B', 'C', 'D'], ['B', 'C', 'D', 'E'], ['E', 'F', 'G', 'H'],

我有一个看起来像这样的数据框:

df = pd.DataFrame({'name': [0, 1, 2, 3], 'cards': [['A', 'B', 'C', 'D'],
                                                   ['B', 'C', 'D', 'E'],
                                                   ['E', 'F', 'G', 'H'],
                                                   ['A', 'A', 'E', 'F']]})

name    cards
0       ['A', 'B', 'C', 'D']
1       ['B', 'C', 'D', 'E']
2       ['E', 'F', 'G', 'H']
3       ['A', 'A', 'E', 'F']
    name  0    1    2    3
name
0         4    3    0    1
1         3    4    1    1
2         0    1    4    2
3         1    1    2    4
我想创建一个如下所示的矩阵:

df = pd.DataFrame({'name': [0, 1, 2, 3], 'cards': [['A', 'B', 'C', 'D'],
                                                   ['B', 'C', 'D', 'E'],
                                                   ['E', 'F', 'G', 'H'],
                                                   ['A', 'A', 'E', 'F']]})

name    cards
0       ['A', 'B', 'C', 'D']
1       ['B', 'C', 'D', 'E']
2       ['E', 'F', 'G', 'H']
3       ['A', 'A', 'E', 'F']
    name  0    1    2    3
name
0         4    3    0    1
1         3    4    1    1
2         0    1    4    2
3         1    1    2    4
其中,值是共同的项目数


有什么想法吗?

通过列表理解和迭代所有对,我们可以得出以下结果:

import pandas as pd
df = pd.DataFrame({'name': [0, 1, 2, 3], 'cards': [['A', 'B', 'C', 'D'],
                                               ['B', 'C', 'D', 'E'],
                                               ['E', 'F', 'G', 'H'],
                                               ['A', 'A', 'E', 'F']]})
result=[[len(list(set(x) & set(y))) for x in df['cards']] for y in  df['cards']]


print(result)
输出:

[[4, 3, 0, 1], [3, 4, 1, 1], [0, 1, 4, 2], [1, 1, 2, 3]]
“&”用于计算两个集合的交集

这正是您想要的:

import pandas as pd
df = pd.DataFrame({'name': [0, 1, 2, 3], 'cards': [['A', 'B', 'C', 'D'],
                                                    ['B', 'C', 'D', 'E'],
                                                    ['E', 'F', 'G', 'H'],
                                                    ['A', 'A', 'E', 'F']]})
result=[[len(x)-max(len(set(y) -  set(x)),len(set(x) -  set(y))) for x in df['cards']] for y in  df['cards']]


print(result)
输出:

[[4, 3, 0, 1], [3, 4, 1, 1], [0, 1, 4, 2], [1, 1, 2, 4]]
使用method和
lambda
我们可以直接得到一个数据帧

def func(df, j):
    return pd.Series([len(set(i)&set(j)) for i in df.cards])

newdf = df.cards.apply(lambda x: func(df, x))
newdf

    0   1   2   3
0   4   3   0   1
1   3   4   1   1
2   0   1   4   2
3   1   1   2   3
输出
你能详细解释一下“共同点”是什么意思吗?前两个列表有三个共同点。第一个和第三个没有共同点,第一个和最后一个只有1个共同点。作为另一个考试,AABBB和AAABB应该有4个共同点。如果你的意思是元素(0,3)应该是2,但你写的1Nope(0,3)应该是1。这两个列表只有一个共同点。有没有办法将其矢量化?我有500000行df,每个列表有36个项目长。你是说转换为df?不,我的意思是我已经有500000行df,列表有36个项目长。列表理解似乎很慢。当您本可以执行
def func(j):
并直接通过
func
时,为什么要使用
lambda
?没有特别的原因。这样看起来更容易理解