过滤具有 2 个相同单词的行

Posted

技术标签:

【中文标题】过滤具有 2 个相同单词的行【英文标题】:Filtering the row that has the 2 same words 【发布时间】:2021-05-24 03:45:30 【问题描述】:

我想从数据框中过滤出具有两个相同单词的行。

我的数据框看起来像:

        Invitation

0     (Anna, Lia, Kim)

1     (Angela, Tom, Yoon, Tom)

2     (Lily, Mina, John, John)

3     (Ella, Kim, Annie, Caesy)

4     (Bella, Kate, Lyon)

我想要的输出是:

         Invitation

0     (Anna, Lia, Kim)

1     (Ella, Kim, Annie, Caesy)

2     (Bella, Kate, Lyon)

我首先将数据框放入列表中

df_name["Invitation"] = df_name["Invitation"].tolist()

但我不确定下一步该做什么。

【问题讨论】:

("Anna", "Lia", "Kim") 还是"(Anna, Lia, Kim)" 存储在行中?是什么类型的? 我试过df_name["Invitation"].dtype ,结果是dtype('O') 你能告诉我为什么(贝拉、凯特、里昂)应该出现在输出中吗? 对于索引 1,“Tom”被列出两次,对于索引 2,“John”被列出两次。其余的行都只有一次名称! @Lyliie - 你能测试一下print (type(df_name.loc[0, "Invitation"])) 是什么吗? 【参考方案1】:

如果存在元组,您可以通过比较相同长度的集合和元组值来过滤行 - 因此删除具有 2 个或更多重复单词的行:

print (type(df_name.loc[0, "Invitation"]))
<class 'tuple'>

df = df_name[df_name['Invitation'].apply(lambda x: len(set(x)) == len(x))]
print (df)
                  Invitation
0           (Anna, Lia, Kim)
3  (Ella, Kim, Annie, Caesy)
4        (Bella, Kate, Lyon)

如果需要删除恰好包含 2 个单词的行:

from collections import Counter

mask = df_name['Invitation'].apply(lambda x: any(v == 2 for k, v in Counter(x).items()))
df = df_name[~mask]
print (df)
                  Invitation
0           (Anna, Lia, Kim)
3  (Ella, Kim, Annie, Caesy)
4        (Bella, Kate, Lyon)

【讨论】:

有没有办法将列表中包含特定单词的行删除两次?例如,将所有带有“John”的行删除两次,但不删除其他名称的行两次? @Lyliie - 然后使用df = df_name[~df_name['Invitation'].apply(lambda x: any(v == 2 and k == 'John' for k, v in Counter(x).items()))]

以上是关于过滤具有 2 个相同单词的行的主要内容,如果未能解决你的问题,请参考以下文章

保留具有特定单词的行[重复]

如果单词退出,则删除行并在powershell中打印具有两个单词的行之间的所有行

正则表达式删除与第二个字符串匹配的行?

scala 根据具有相同值的 2 列过滤掉连接 df 中的行 - 最佳方式

面试官:如何在十亿个单词字典中,判断某个单词是否存在?(布隆过滤器)

当单元格具有特定单词时,突出显示 excel mac 2011 中的行