删除包含DF中重复单词的短语(Pandas,Python3)

时间:2014-09-26 18:03:10

标签: python python-3.x pandas

我正在合并几个基于前缀匹配在一起的DF。这种方法有90%的时间用于创建语义正确的字符串,但有时,以这种方式合并可以创建短语“循环”#34;一起。这是我的DF看起来的一个例子,它可以更好地解释我的意思:

Words            Words1              Words2
Big Hitter       Up and Down         A Cold Lonely Night
Snail Mail       Wood Grain Rail     Cup of Lemon Tea
....             .....               .....
French Fries     Bat Boy Bat         Small Ball Small Ball
Phone Book       Fee No Fee          Hands up Hands up

第2栏和第3栏中的底部两个例子就是我所说的他们"循环在一起" - 即字符串包含相同单词的副本。

我知道如何使用

重复删除这些短语
re.sub(r'\b(.+)(\s+\1\b)+', r'\1', s)

但我需要他们完全消失。 是否有人知道如何删除这些包含DF中每列重复字词的字符串?

所以我希望像

这样的DF
Words            Words1              Words2
Big Hitter       Up and Down         A Cold Lonely Night
Snail Mail       Wood Grain Rail     Cup of Lemon Tea
....             .....               .....
French Fries     
Phone Book       

1 个答案:

答案 0 :(得分:1)

有趣的问题。如下:

分解成更好地展示这个想法的步骤:

In [39]:

print df
          Words           Words1                 Words2
0    Big Hitter      Up and Down    A Cold Lonely Night
1    Snail Mail  Wood Grain Rail       Cup of Lemon Tea
2  French Fries      Bat Boy Bat  Small Ball Small Ball
3    Phone Book       Fee No Fee      Hands up Hands up
In [40]:

print df.applymap(lambda x: len(' '.join(set(x.split())))==len(x))
  Words Words1 Words2
0  True   True   True
1  True   True   True
2  True  False  False
3  True  False  False
In [41]:

print df.where(df.applymap(lambda x: len(' '.join(set(x.split())))==len(x)),
               '')
          Words           Words1               Words2
0    Big Hitter      Up and Down  A Cold Lonely Night
1    Snail Mail  Wood Grain Rail     Cup of Lemon Tea
2  French Fries                                      
3    Phone Book

我们正在使用lambda函数将数据框中的每个单词分解为list,然后将其转换为set,这将删除相同的多个实例字。然后我们问这个词是否变得更短。如果确实如此,必须有一些重复的词。这就是lambda函数正在做的事情。我们在此步骤中创建了boolean数据框。

df.where部分是直截了当的。它查看我们刚创建的boolean数据帧,如果单元格为true,结果数据帧将从df获取相应的值,否则单元格将获得第二个指定的值论点。在这里,我们使用'',这会使单元格在false数据框中boolean的任何位置都为空。