两列之间的熊猫列表相似性

时间:2019-09-19 18:09:34

标签: 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']]})

我想找到字符串列表之间的相似性。这应该忽略顺序或长度(即['dog', 'mouse']['mouse', 'dog']应该导致100%相似)。这是我的尝试(https://www.geeksforgeeks.org/python-percentage-similarity-of-lists/):

df['result'] = len(set(df['list_left']) & set(df2['list_right'][1])) / float(len(set(df['list_left']) | set(df['list_right']))) * 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'

与pandas df中的列表列进行比较的好方法是什么?列表之间的相似性对于不同长度的字符串列表是否有意义?

2 个答案:

答案 0 :(得分:1)

解决方案将使用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

等式的解释

首先在等式中检查常见元素:

df.apply(lambda x: len(set(x['list_left']) & set(x['list_right'])), 1)

输出:

0    1
1    2
2    0
dtype: int64

接下来,您检查列表的不同元素并将其乘以:

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

输出:

0    4
1    2
2    4
dtype: float64

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

答案 1 :(得分:1)

不使用apply

的解决方案
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