【问题标题】:Best way to remove specific words from column in pandas dataframe?从熊猫数据框中的列中删除特定单词的最佳方法?
【发布时间】:2021-12-29 02:50:12
【问题描述】:

我正在处理大量无法在 excel 中处理的数据,因此我使用的是 Pandas/Python,但我对它比较陌生。我有这列书名,其中还包括书名前后的流派。我只希望该列包含书名,那么删除流派的最简单方法是什么?

以下是该列包含的示例:

Book Labels
Science Fiction | Drama | Dune
Thriller | Mystery | The Day I Died
Thriller | Razorblade Tears | Family | Drama
Comedy | How To Marry Keanu Reeves In 90 Days | Drama
...

所以在上面,书名是沙丘、我死去的那一天、剃刀之泪和如何在 90 天内嫁给基努·里维斯,但正如你所看到的,这些类型在标题之前和之后。

我在想我可以创建一个所有类型的列表(因为只有这么多),然后将它们与“|”一起从列中删除字符,但如果有人对删除流派和“|”的更简单方法有建议关键,请帮帮我。

【问题讨论】:

    标签: python pandas string dataframe


    【解决方案1】:

    这是对@tdy Regex 解决方案的增强。原始的正则表达式Family|Drama 将匹配字符串中的单词“Family”和“Drama”。如果书名中包含gernes 中的字词,这些字词也会被删除。

    假设标签用“|”隔开,我们要去掉三个匹配条件。

    1. Gerne 在字符串的开头。例如Drama | ...
    2. Gerne 在中间。例如... | Drama | ...
    3. Gerne 在字符串的末尾。例如... | Drama

    使用正则表达式(^|\| )(?:Family|Drama)(?=( \||$)) 匹配三个条件之一。注意| Drama | Family有2个重叠匹配,这里我使用?=( \||$)来避免只匹配一次。有关详细信息,请参阅此问题[Use regular expressions to replace overlapping subpatterns]

    >>> genres = ["Family", "Drama"]
    
    >>> df
    
    #                       Book Labels
    # 0      Drama | Drama 123 | Family
    # 1      Drama 123 | Drama | Family
    # 2      Drama | Family | Drama 123
    # 3  123 Drama 123 | Family | Drama
    # 4      Drama | Family | 123 Drama
    
    >>> re_str = "(^|\| )(?:{})(?=( \||$))".format("|".join(genres))
    
    >>> df['Book Labels'] = df['Book Labels'].str.replace(re_str, "", regex=True)
    
    # 0       | Drama 123
    # 1        Drama 123
    # 2        | Drama 123
    # 3    123 Drama 123
    # 4        | 123 Drama
    
    >>> df["Book Labels"] = df["Book Labels"].str.strip("| ")
    
    # 0        Drama 123
    # 1        Drama 123
    # 2        Drama 123
    # 3    123 Drama 123
    # 4        123 Drama
    

    【讨论】:

      【解决方案2】:

      由于您的示例显示标题的位置不一致,我会同意您的想法:

      创建所有类型的列表(因为只有这么多),然后将它们与“|”一起从列中删除字符

      使用Series.replace 删除流派,使用Series.str.strip 删除分隔符:

      genres = ['Science Fiction', 'Drama', 'Thriller', 'Mystery', 'Family', 'Comedy']
      df['Book Labels'] = df['Book Labels'].replace('|'.join(genres), '', regex=True).str.strip('| ')
      
      #                             Book Labels
      # 0                                  Dune
      # 1                        The Day I Died
      # 2                      Razorblade Tears
      # 3  How To Marry Keanu Reeves In 90 Days
      

      如果标题始终位于一致的位置,例如列表中的第 3 位,则我们不需要类型列表。我们可以使用Series.str.splitexpand=True 并获得第三列(索引2):

      # only works if the title is always in position 3 (index 2)
      index = 2
      df['Book Labels'] = df['Book Labels'].str.split('|', expand=True)[index]
      

      【讨论】:

      • 感谢您的帮助!!
      猜你喜欢
      • 2017-01-11
      • 2016-09-15
      • 1970-01-01
      • 2018-10-25
      • 2019-11-13
      • 2018-12-20
      • 2021-08-13
      • 1970-01-01
      相关资源
      最近更新 更多