#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-файла.