【问题标题】:Filtering the row that has the 2 same words过滤具有 2 个相同单词的行
【发布时间】: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"])) 是什么吗?

标签: python pandas list dataframe filter


【解决方案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()))]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
相关资源
最近更新 更多