我正在合并几个基于前缀匹配在一起的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中每列重复字词的字符串?
所以我希望像
这样的DFWords Words1 Words2
Big Hitter Up and Down A Cold Lonely Night
Snail Mail Wood Grain Rail Cup of Lemon Tea
.... ..... .....
French Fries
Phone Book
答案 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
的任何位置都为空。