Кажется, это то, что вы хотите:
Сначала создайте столбец kw
, чтобы указать , какое ключевое слово соответствует в этой строке
df2['kw'] = [next(iter(s)) for s in df2.child.str.split().transform(set).values & set(parent_dict.values())]
df['kw'] = [next(iter(s)) for s in df.parent.str.split().transform(set).values & set(parent_dict.values())]
Код кажется сложным, но простым. Вы используете оператор &
между одним массивом set
s и одним набором ключевых слов. Это позволит извлечь пересечение между каждым набором слов и вашим заранее заданным набором ключевых слов. Часть next(iter(s))
- это просто быстрый способ получить первый элемент из set
. (Я предполагаю, что в каждой строке будет присутствовать только одно ключевое слово. Если вы хотите дифференцировать строки по количеству найденных ключевых слов - например, классифицировать строку только с «Марсом» и строку с «Марсом» "и" Плутон "должны отличаться - тогда вы должны использовать tuple(s)
и использовать кортежи, которые можно хэшировать)
Затем вы можете назначить категории для каждого df
, чтобы помочь вам позже
df['cat'] = 'parent'
df2['cat'] = 'child'
Затем вы можете concat
фреймы данных и использовать индексы для сортировки, как вы хотите
pd.concat([df,df2.rename(columns={'child':'parent', 'value':'parent_value'})],sort=False).set_index(['kw', 'cat']).sort_index(ascending=[True,False])
parent parent_value
kw cat
Mars parent Alpha Mars 4
child Life on Mars 99
child Mars Robot 105
Pluto parent Pluto 9
child Ice Pluto Tune 101
Sun parent Super Sun 0
child Planet Sun 100
child one Sun direction 101
child Sun Twins 200
Обратите внимание, что я переименовал столбцы, чтобы они были такими же, как parent_df
. Вы можете выбрать любое имя, которое вам подходит. Если вы хотите точно опубликованный вами результат, просто сбросьте индекс после сортировки и извлеките два последних столбца:
(....).reset_index()[['parent', 'parent_value']]
parent parent_value
0 Alpha Mars 4
1 Life on Mars 99
2 Mars Robot 105
3 Pluto 9
4 Ice Pluto Tune 101
5 Super Sun 0
6 Planet Sun 100
7 one Sun direction 101
8 Sun Twins 200