【问题标题】:Splitting Column in Pandas using Regex使用正则表达式拆分 Pandas 中的列
【发布时间】:2020-06-08 15:31:09
【问题描述】:

我的第一个问题...我有一个带有 'Description' 列的 Pandas 数据框。该列有一个引用和一个我想分成两列的名称。我在单独的 df 中有 'Names'

#  Description                                   #  Names
---------------------------------------          ---------------
0  A long walk by Miss D'Bus                     0  Teresa Green
1  A day in the country by Teresa Green          1  Tim Burr
2  Falling Trees by Tim Burr                     2  Miss D'Bus
3  Evergreens by Teresa Green
4  Late for Dinner by Miss D'Bus

我已成功搜索描述以确定它是否具有匹配的名称,方法是使用包含所有名称的正则表达式字符串:

regex = '$|'.join(map(re.escape, df['Names'])) + '$' 
df['Reference'] = df['Description'].str.split(regex, expand=True)

得到

#  Description                                   Reference
-----------------------------------------------------------------------
0  A long walk by Miss D'Bus                     A long walk by
1  A day in the country by Teresa Green          A day in the country by
2  Falling Trees by Tim Burr                     Falling Trees by
3  Evergreens by Teresa Green                    Evergreens by
4  Late for Dinner by Miss D'Bus                 Late for Dinner by

但我希望将相应的(= 已删除分隔符)名称作为附加列。

它尝试添加 *?像this这样的正则表达式

我尝试使用“参考”列拆分“描述”列

df['Name'] = df['Description'].str.split(df['Reference'])

我尝试使用“参考”字符串的长度来分割“描述”列,例如

# like: df['Name'] = df['Description'].str[-10:]
df['Name'] = df['Description'].str[-(df['Reference'].str.len()):]

但我得到一个恒定的切片长度。

【问题讨论】:

    标签: regex python-3.x pandas split


    【解决方案1】:

    您可以使用Series.str.extract 从原始列中获取两种类型的信息:

    regex = r'^(.*?)\s*({})$'.format('|'.join(map(re.escape, df['Names'])))
    df[['Reference','Name']] = df['Description'].str.extract(regex, expand=True)
    

    输出:

    >>> df
                                Description                Reference          name
    0             A long walk by Miss D'Bus           A long walk by    Miss D'Bus
    1  A day in the country by Teresa Green  A day in the country by  Teresa Green
    2             Falling Trees by Tim Burr         Falling Trees by      Tim Burr
    3            Evergreens by Teresa Green            Evergreens by  Teresa Green
    4         Late for Dinner by Miss D'Bus       Late for Dinner by    Miss D'Bus
    

    正则表达式看起来像^(.*?)\s*(Teresa\ Green|Tim\ Burr|Miss\ D\'Bus)$:

    • ^ - 字符串开头
    • (.*?) - 第 1 组(“参考”):除换行符之外的任何零个或多个字符,尽可能少
    • \s* - 0+ 个空格
    • (Teresa\ Green|Tim\ Burr|Miss\ D\'Bus) - 第 2 组(“名称”):具有已知名称的备用组
    • $ - 字符串结束。

    【讨论】:

      猜你喜欢
      • 2018-04-06
      • 2021-04-23
      • 2020-08-07
      • 2020-08-25
      • 1970-01-01
      • 1970-01-01
      • 2021-02-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多