【问题标题】:Remove phrases That Contain Duplicate Words from a DF (Pandas, Python3)从 DF 中删除包含重复单词的短语(Pandas,Python3)
【发布时间】:2014-11-21 19:48:35
【问题描述】:

我正在将几个基于前缀匹配在一起的 DF 合并在一起。这在 90% 的情况下可以创建语义正确的字符串,但有时,以这种方式合并可以创建“循环”在一起的短语。这是我的 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       

【问题讨论】:

    标签: python python-3.x pandas


    【解决方案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获取相应的值,否则单元格将获得第二个参数指定的值。这里我们使用'',这将使boolean数据框中的false处的单元格为空。

    【讨论】:

    • 嗨 CT -- 我一直收到这个错误:AttributeError: ("'float' object has no attribute 'split'", 'occured at index Words') 有什么想法吗?
    • 看起来不是所有的列都是strings?
    • 想通了,并且解决方案有效——您介意对它的工作原理进行更多描述,以便我学习吗?谢谢!
    • 这实际上非常有趣,而且一些开箱即用的想法很棒,谢谢!快速提问:如果我删除脚本的 ' ' 部分,它会删除单元格而不是仅添加空格吗?
    • 如果你这么想的话,数据框总是会是一个 n*m 2D 矩阵。所以单元格仍然存在(即,不会被删除以释放分配的内存)。但是,我相信第二个参数的默认值是other=nan。因此,跳过它可能会将这些单元格设置为缺失值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-08
    • 1970-01-01
    • 1970-01-01
    • 2022-11-07
    • 1970-01-01
    • 1970-01-01
    • 2019-02-19
    相关资源
    最近更新 更多