Как проверить пропущенные слова из одного столбца в другие несколько столбцов с помощью FuzzyWuzzy?

#python #fuzzy-logic #fuzzywuzzy #fuzzy-comparison

Вопрос:

У меня есть столбец item_composition ,в котором содержатся различные элементы, и я хочу проверить, доступны ли слова из item composition других 3 столбцов для ex A, B .

item_композиция A B
Стеариновая кислота ; цинк ; Пентаэритрит Пентаэритрит Нет

Примерный лист : Примерный лист

Приведенная выше таблица Stearic acid ; zinc недоступна как в столбце A, так и в столбце B, поэтому я должен напечатать Stearic acid ; zinc на выходе

 import pandas as pd
import numpy as np
from fuzzywuzzy import process, fuzz
ramen = pd.read_excel('Material_composition_costdriver_mapping_icis_ihs.xlsx')
ramen.head()


for col in ramen[['item_composition_in_english','formula_composition_list','composition_icis_index_matches','composition_ihs_index_matches']]:
    ramen[col] = ramen[col].str.strip()
    print('Number of unique values in '   str(col)  ': '   str(ramen[col].nunique()))
 

Я не нашел никакого решения для своих требований. Любая помощь будет оценена по достоинству.

Комментарии:

1. Вы должны предоставить пример набора данных и ожидаемый результат, чтобы дать возможность запускать тесты.

2. @mozway Я отредактировал вопрос. У меня есть ряд данных, но я привел здесь только один пример строки.

3. Смотрите мой ответ. Если вам нужно что-то более подробное, пожалуйста, отредактируйте свой вопрос, чтобы предоставить больше данных и деталей.

4. @mozway Да Я включил лист с примером и упомянул там ожидаемый результат. Пожалуйста, проверьте один раз. Спасибо

5. Первая строка в вашем файле не соответствует вашему предыдущему примеру («Пентаэритрита» больше нет в столбце А). Это нормально? Кроме того, для второй строки у вас есть «Фенол , нафта» в колонке А и отдельные позиции «Нафта» и «Фенол» в Б/Д репрезентативно. Следует ли комбинированный «Фенол , нафта» рассматривать как один или два элемента?

Ответ №1:

Вы можете использовать следующий код. Это создает два набора и вычисляет разницу. Следует отметить, что порядок элементов не обязательно сохраняется. Если это проблема, то есть альтернативы, но я нахожу этот подход довольно минималистичным и эффективным.

 ramen = pd.DataFrame([['Stearic acid ; zinc ; Pentaerythritol', 'Pentaerythritol', None]], columns=['item_composition', 'A', 'B'])
ramen

def check_items(s):
    items = s['item_composition'].split(' ; ')
    ref_items = s.drop('item_composition')
    return ' ; '.join(set(items)-set(ref_items))

ramen.apply(check_items, axis=1)
 

вход:

                         item_composition                A     B
0  Stearic acid ; zinc ; Pentaerythritol  Pentaerythritol  None
 

выход:

 0    zinc ; Stearic acid
 

Редактировать: вот обновленная версия для ввода файлов, аналогичных предоставленным вами (я полагаю, что комментария нет, как и столбцов «формальные отсутствующие индексы»), и для экспорта выходных данных в формате xlsx с дополнительным столбцом

 def check_items(s, col='formula_composition_list', ref_columns=['A', 'B', 'C', 'D']):
    import re
    items = re.split(' *; *', s[col])
    ref_items = s[ref_columns].dropna().str.strip()
    return ' ; '.join(set(items)-set(ref_items))

files = ['example.xlsx'] ## add other files in list
                         ## or use another way to list files
                         ## such as the glob module

for f in files:
    df = pd.read_excel(f)
    df['formulae_missing_indices'] = df.apply(check_items, axis=1)
    df.to_excel(f[:-5] '_out.xlsx')
 

Комментарии:

1. Спасибо, но мы не можем взять наборы данных из xls и получить результат. Мы проверяем значения из item_композиции в столбцах A и B. Предположим, у меня есть сотни подобных данных, тогда описанный выше метод не подойдет правильно.

2. Вы имеете в виду, что вам нужно обработать несколько файлов? Затем вам нужно перебрать их, применить метод и в конечном итоге вывести результат в файл. Если это так, пожалуйста, измените свой вопрос, чтобы добавить эту информацию и предоставить пример xlsx-файла.