#python #python-3.x #pandas #dataframe
#python #python-3.x #панды #фрейм данных
Вопрос:
У меня есть фрейм данных «молекулы» и фрейм данных «Описание» (имеющие форму (18000,1) и (75-000,1) соответственно). Во фрейме данных «Описание» может присутствовать одно или несколько имен молекул. Теперь я могу получить любые индексы в фрейме данных ‘Description’, имеющие имена молекул, из фрейма данных ‘molecules’, но как я могу получить значение (строку), совпадающее со столбцом ‘Description’, и сохранить его в новом столбце в фрейме данных ‘Description’. Ниже приведен код, который я использовал для сравнения:
zipped = zip(part2['Item Description'], list1['molecules'])
part2['Matched'] = np.array(set(a.split()) amp; b for a, b in zipped).astype(bool)
Я хочу присвоить значение «b» для каждого «Описания» и сохранить его по порядку.Заранее спасибо.
Вот примеры фреймов данных, которые у меня есть: DF1:
molecules
benzene
sodium
vitamin A
DF2:
Item Description
100 mg combination of benzene and sodium.
Will need to increase vitamin A dosage.
Выходной фрейм данных, который я хочу:
Item Description Matched_molecule
100 mg combination of benzene and sodium. benzene,sodium
Will need to increase vitamin A dosage. vitamin A
Комментарии:
1. для удобства понимания, пожалуйста, разместите примеры фреймов данных и желаемый результат.
2. Понял. Я надеюсь, что теперь это полезно.
Ответ №1:
Хорошо, для простоты я просто записал оба ваших входных фрейма данных в коде. Обратите внимание, что я определил таблицу молекул как серию, а описание элемента — как фрейм данных.
import pandas as pd
ser1 = pd.Series(['benzene', 'sodium', 'vitamin A'], name='molecules')
df2 = pd.DataFrame(['100 mg combination of benzene and sodium.',
'Will need to increase vitamin A dosage.'],
columns=['Item Description'])
Теперь я просто применяю лямбда-функцию к столбцу «Описание товара» df2, которая проверяет каждую молекулу в ser1, есть ли она в описании товара, и если она есть, добавляет ее в список (через понимание списка). Команда join затем выделяет строку из списка с запятой в качестве разделителя.
df2['Matched_molecule'] = df2['Item Description'].apply(
lambda desc: ','.join([mol for mol in ser1 if mol in desc]))
Вывод соответствует предложенному.