替换 Pandas 中列表类型列中的重复项

问题描述

背景信息:我有一个数据框 df,其中包含多个列,其中重点是名为“流派”的列

目标:

The problem can be seen in this image,there are entries where duplicates are found for example '[Drama,Romance]' and '[Romance,Drama]' are the same thing

  1. 现在的目标是以编程方式删除/替换重复项,以便将变体替换为其等效形式,例如这样。

示例:

'[戏剧,浪漫]'和'[浪漫,戏剧]'

现在 [Romance,Drama] 替换为 [Drama,Romance],反之亦然,而不是完全删除,我们只是替换列表的内容

Output - Before Replacing Duplicates '[Drama,Drama]'

Expected Output - After Replacing Duplicates '[Drama,Romance]'

  1. 过滤 df 列“流派”以仅包含列表条目不超过 3 个流派的流派,例如删除任何超过 3 个流派的行。 “流派”列中可接受的结果示例:
  • [爱情、戏剧、喜剧]
  • [浪漫、戏剧]
  • [戏剧]

我尝试了以下方法

#to delist the 'genres' column
df['genres'] = df.genres.apply(','.join)

# code sample of manually replaced duplicated content in genres column
df['genres'] = df['genres'].str.replace("Romance,Drama","Drama,Romance")
df['genres'] = df['genres'].str.replace("Drama,Comedy","Comedy,Drama")

上述代码有效,但它是针对单个重复项手动完成的,因此我想找到一种方法来为 df

的“流派”列中找到的所有重复项进行编码

解决方法

假设列中每一行的数据类型为 list

  1. 您可以先使用 sorted

    对每行列表进行排序
  2. 然后用 loc 过滤数据框的行并得到 value_counts()

    df['genres'] = df['genres'].apply(lambda x: sorted(x))
    df.loc[df['genres'].apply(lambda x: len(x) <= 3),'genres'].value_counts()