Python Pandas Dataframe столбцы списков, получить пересечение и применить функцию к другому столбцу
Проблемные данные
df = pd.DataFrame({'Keyword': ['basement finishing systems akron pa', 'basement finishing systems biglerville pa', 'basement finishing systems chambersburg pa', 'basement finishing systems christiana pa', 'basement finishing systems delta pa'], 'StemmedKW': [['basement', 'finish', 'system', 'akron', 'pa'], ['basement', 'finish', 'system', 'biglervil', 'pa'], ['basement', 'finish', 'system', 'chambersburg', 'pa'], ['basement', 'finish', 'system', 'christiana', 'pa'], ['basement', 'finish', 'system', 'delta', 'pa']], 'Ad Group': ['Finishing System', 'Finishing System', 'Finishing System', 'Finishing System', 'Finishing System'], 'Campaign': ['Campaign A', 'Campaign A', 'Campaign A', 'Campaign A', 'Campaign A'], 'StemmedAG': [['finish', 'system'], ['finish', 'system'], ['finish', 'system'], ['finish', 'system'], ['finish', 'system']]}, columns=['Campaign', 'Ad Group', 'Keyword', 'StemmedAG', 'StemmedKW'])
Dataframe выглядит так
Campaign Ad Group Keyword \
0 Campaign A Finishing System basement finishing systems akron pa
1 Campaign A Finishing System basement finishing systems biglerville pa
2 Campaign A Finishing System basement finishing systems chambersburg pa
3 Campaign A Finishing System basement finishing systems christiana pa
4 Campaign A Finishing System basement finishing systems delta pa
StemmedAG StemmedKW
0 [finish, system] [basement, finish, system, akron, pa]
1 [finish, system] [basement, finish, system, biglervil, pa]
2 [finish, system] [basement, finish, system, chambersburg, pa]
3 [finish, system] [basement, finish, system, christiana, pa]
4 [finish, system] [basement, finish, system, delta, pa]
контекст
StemmedAG
а также StemmedKW
столбцы списков. Я произвел эти столбцы словом Ad Group
а также Keyword
колонны. Цель состоит в том, чтобы поставить знак плюс +
перед ключевыми словами в Keyword
столбец для любых слов, которые появляются в обоих StemmedAG
а также StemmedKW
,
Результат
Обратите внимание, как row 0
Keyword
имеет значение basement +finishing +systems akron pa
? Это произошло бы потому, что слово finish
а также system
оба появляются в StemmedAG
а также StemmedKW
, Поэтому знаки плюс ставятся перед неосновными словами в Keyword
колонка.
Campaign Ad Group Keyword \
0 Campaign A Finishing System basement +finishing +systems akron pa
1 Campaign A Finishing System basement +finishing +systems biglerville pa
2 Campaign A Finishing System basement +finishing +systems chambersburg pa
3 Campaign A Finishing System basement +finishing +systems christiana pa
4 Campaign A Finishing System basement +finishing +systems delta pa
StemmedAG StemmedKW
0 ['finish', 'system'] ['basement', 'finish', 'system', 'akron', 'pa']
1 ['finish', 'system'] ['basement', 'finish', 'system', 'biglervil', ...
2 ['finish', 'system'] ['basement', 'finish', 'system', 'chambersburg...
3 ['finish', 'system'] ['basement', 'finish', 'system', 'christiana',...
4 ['finish', 'system'] ['basement', 'finish', 'system', 'delta', 'pa']
Я не привык работать с lists
в столбцах панд и не знаю, как получить пересечение lists
из двух столбцов в dataframe
, затем получите индекс того, где слова появляются, затем примените знаки плюс в начале каждого найденного индекса. Или может быть проще заменить строку на df['Keyword']
используя слова из StemmedAG
?
Я также хотел бы сделать это как можно более пандой и избежать for
петли.
1 ответ
Я понял, как этого добиться, используя подход, не связанный с пандами, но это довольно неприятно. Я действительно надеялся научиться делать это с пандами (если это вообще возможно!)
for idx in df.index:
intersect = list(set(df['StemmedAG'][idx]).intersection(df['StemmedKW'][idx]))
positions = [i for word in intersect for i, j in enumerate(df['StemmedKW'][idx]) if j == word]
df.loc[idx, 'Keyword'] = ' '.join(["+"+word if df['Keyword'][idx].split().index(word) in positions else word for word in df['Keyword'][idx].split()])