Сходство списка панд между двумя колоннами - PullRequest
1 голос
/ 19 сентября 2019

У меня есть 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'

Какой хороший способ сравнить столбцы списков в dand pandas?сходство между списками имеет логический смысл для списков строк разной длины?

Ответы [ 2 ]

1 голос
/ 19 сентября 2019

Здесь решение без использования 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
1 голос
/ 19 сентября 2019

Решение должно использовать 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...