Строки соответствия 2 столбцов dataframe в Python - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть два фрейма данных:

Df1:

Оригинал df имеет 1000+ Имя

   Id    Name
    1     Paper
    2     Paper Bag
    3     Scissors
    4     Mat
    5     Cat
    6     Good Cat

2nd Df:

Оригинал df имеет1000+ Item_Name

Item_ID   Item_Name
1         Paper Bag
2         wallpaper
3         paper
4         cat cage
5         good cat

Ожидаемый результат:

Id Name         Item_ID
1  Paper         1,2,3
2  Paper Bag     1,2,3
3  Scissors      NA 
4  Mat           NA 
5  Cat           4,5
6  Good Cat           4,5

Мой код:

def matcher(x):
    res = df2.loc[df2['Item_Name'].str.contains(x, regex=False, case=False), 'Item_ID']
    return ','.join(res.astype(str))

df1['Item_ID'] = df1['Name'].apply(matcher)

Текущие вызовы

str.contains работает, когда имя имеет Paper, а Item_Name - Paper Bag, но не работает наоборот.Итак, в моем примере это работает для строки 1,3,4,5 для df1, но не для строки 2 и 6. Таким образом, это будет не map строка 2 df1 со строкой 3из df2

Ask

Так что, если вы можете помочь мне в изменении кода, чтобы он мог помочь в сопоставлении с другим раундом также

1 Ответ

0 голосов
/ 28 ноября 2018

Вы можете изменить свою пользовательскую функцию matcher и использовать apply():

def matcher(query):

    matches = [i['Item_ID'] for i in df2[['Item_ID','Name']].to_dict('records') if any(q in i['Name'].lower() for q in query.lower().split())]
    if matches:
        return ','.join(map(str, matches))
    else:
        return 'NA'

df1['Item_ID'] = df1['Name'].apply(matcher)

Возвраты:

   Id       Name Item_ID
0   1      Paper   1,2,3
1   2  Paper Bag   1,2,3
2   3   Scissors      NA
3   4        Mat      NA
4   5        Cat     4,5
5   6   Good Cat     4,5

Объяснение:

Мы используем apply(), чтобы применить нашу пользовательскую функцию matcher() к каждому значению строки вашего столбца df1['Name'].В нашей функции matcher() мы конвертируем df2 в словарь с ключами Item_ID и значениями Name.Затем мы можем проверить, присутствует ли наше текущее значение строки query в any() из Name значений из df1 (преобразовано в нижний регистр через lower()), и если да, то мы можем добавить Item_IDв список, который будет возвращен.

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