【问题标题】:Python Pandas Dataframe Columns of Lists, Get Intersection And Apply Function To Another ColumnPython Pandas Dataframe 列表的列,获取交集并将函数应用于另一列
【发布时间】:2016-02-13 01:37:15
【问题描述】:

问题数据

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'])

数据框看起来像这样

     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] 

上下文

StemmedAGStemmedKW 是列表的列。我通过词干Ad GroupKeyword 列来生成这些列。目标是在 Keyword 列中的关键字前面放置一个加号 +,以表示出现在 StemmedAGStemmedKW 中的任何单词。

结果

注意row 0 Keyword 的值是basement +finishing +systems akron pa 吗?这是因为finishsystem 都出现在StemmedAGStemmedKW 中。因此,在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'] 

我不习惯在 Pandas 的列中使用 lists 并且不知道如何从 dataframe 的两列中获取 lists 的交集,然后获取单词出现位置的索引,然后将加号应用到每个找到的索引的前面。或者使用StemmedAG 中的单词替换df['Keyword'] 上的字符串可能更简单?

我还想尽可能以最熊猫的方式做到这一点,并避免 for 循环。

【问题讨论】:

    标签: python list pandas dataframe intersection


    【解决方案1】:

    我想出了如何使用非熊猫方法来实现这一点,但它非常讨厌。我真的很希望学习如何使用 pandas 来做到这一点(如果可能的话!)

    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()])
    

    【讨论】:

      猜你喜欢
      • 2020-12-09
      • 2013-10-07
      • 2017-09-11
      • 2020-03-10
      • 2012-09-26
      • 1970-01-01
      相关资源
      最近更新 更多