Как сопоставить и объединить два кадра данных, имеющие совершенно разные значения, кроме одного слова?Имейте ABC с 10 рядами и XYZ с 22550 рядами - PullRequest
0 голосов
/ 05 февраля 2019

Имейте ABC с 10 рядами и XYZ с 22550 рядами.

дата-фрейм ABC значений:

        0                        1           2
0   sun is rising         |  UNKNOWN    | 1465465
1   micheal has arrived   |   UNKNOWN   | 324654
2   goal has been scored | UNKNOWN     | 547854

и другие значения XYZ

    0         1 
0 sun       | password1
1 goal      | password2

....
....
.....
....
22550
22551  micheal   | password3

как отобразить XYZ с помощью (солнце, цель и micheal) ABC и, таким образом,1 с паролем заменит UNKNOWN 1 в выводе ABC

, в котором я нуждаюсь

    0                        1           2
0  sun is rising         |  password1    | 1465465
1   micheal has arrived  |   password3   | 324654
2   goal has been scored| password2     | 547854

, пробовал ниже и получаю соответствующие ошибки:

d = dict(zip(XYZ[0],XYZ[1]))

pat = (r'({})'.format('|'.join(d.keys())))
ABC[1]=ABC[0].str.extract(pat,expand=False).map(d)
print(ABC)

ошибка: Ошибка типа: элемент последовательности 16069: ожидаемый экземпляр str, найдено с плавающей запятой

from itertools import chain
abc.loc[:,1] = list(chain(*[xyz.loc[abc[0].str.contains(i),1] for i in xyz[0]]))

ошибка: IndexingError: в качестве индексатора предоставлена ​​недопустимая логическая серия (индекс логической серии и индексированного объекта не соответствует

d = dict(zip(XYZ[0], XYZ[1]))
ABC[1] = [next(d.get(y) for y in x.split() if y in d) for x in ABC[0]]
print (ABC)

ошибка: StopIteration:

1 Ответ

0 голосов
/ 05 февраля 2019

Вы можете получить параметр по умолчанию no match, если не соответствует значение:

d = dict(zip(XYZ[0].str.lower(), XYZ[1]))
ABC[1] = [next(iter(d.get(y) for y in x.lower().split() if y in d),'no match') for x in ABC[0]]

Общее решение:

import re

XYZ = XYZ.dropna()
d = dict(zip(XYZ[0].str.lower(), XYZ[1]))
for k, v in d.items():
    ABC.loc[ABC[0].str.contains(re.escape(k), case=False, na=False), 1] = v  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...