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
?没有特别的原因。这样看起来更容易理解