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()])
Другие вопросы по тегам