Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.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: df = pd.DataFrame({'id': [123, 456, 789], 'list_left': [['dog', 'cat'],['dog', 'mouse'], ['dog', 'elephant']], 'list_right': [['cat', 'mouse', 'giraffe'], ['mouse', 'dog'], ['giraffe', 'gorilla']]}) 我想找出

我有一个df:

df = pd.DataFrame({'id': [123, 456, 789],
                   'list_left': [['dog', 'cat'],['dog', 'mouse'], ['dog', 'elephant']],
                   'list_right': [['cat', 'mouse', 'giraffe'], ['mouse', 'dog'], ['giraffe', 'gorilla']]})
我想找出字符串列表之间的相似性。这应忽略顺序或长度(即,
['dog','mouse']
['mouse','dog']
应导致100%的相似性)。以下是我的尝试():

这将导致以下错误:

TypeError                                 Traceback (most recent call last)
<ipython-input-136-3b1e1ee16eed> in <module>()
----> 1 df['new'] = len(set(df['list_left']) & set(df2['list_right'][1])) / float(len(set(df['list_left']) | set(df['list_right']))) * 100

TypeError: unhashable type: 'list'
TypeError回溯(最近一次调用)
在()
---->1 df['new']=len(set(df['list_left'])和set(df2['list_right'][1])/float(len(set(df['list_left'])和set(df['list_right'])*100
TypeError:不可损坏的类型:“列表”

什么是比较数据库中列表列的好方法?对于不同长度的字符串列表,列表之间的相似性是否具有逻辑意义?

解决方案是使用
apply

df.apply(lambda x: len(set(x['list_left']) & set(x['list_right'])) / float(len(set(x['list_left']) | set(x['list_right']))) * 100,1)
输出

0     25.0
1    100.0
2      0.0
dtype: float64
方程式的解释

0     25.0
1    100.0
2      0.0
dtype: float64
在等式中,首先检查公共元素:

df.apply(λx:len(set(x['list\u left'])和set(x['list\u right']),1)

输出:

0    1
1    2
2    0
dtype: int64
0    4
1    2
2    4
dtype: float64
接下来,检查列表中的不同元素并将其乘以:

df.apply(lambda x: float(len(set(x['list_left']) | set(x['list_right']))), 1)
输出:

0    1
1    2
2    0
dtype: int64
0    4
1    2
2    4
dtype: float64

相似性由(公共元素/不同元素)*100定义。因此第一行为
1/4*100=0.25

此处不使用
应用

s = df.list_left + df.list_right
s1 = s.map(set)
(s.str.len() - s1.str.len()) / s1.str.len() * 100

Out[132]:
0     25.0
1    100.0
2      0.0
dtype: float64

为什么第一行有25%的相似性?既然
list\u left
中的一个项目与
list\u right
中的三个项目中的一个项目相匹配,那么它不应该是33%吗?请注意,所讨论的列表有不同的大小。您能解释一下为什么这个百分比是25吗?