【问题标题】:Iterate different Regular Expression Patterns over df Column在 df 列上迭代不同的正则表达式模式
【发布时间】:2018-08-17 11:50:43
【问题描述】:

我有一个 df 列,其中包含文本,我正在尝试从中提取不同的日期模式。

这个df1 例如:

<index>    text    
0          My birthday is 10/23/89.
1          Christmas is on December 25th.
2          Thanksgiving of 11/2008 was the best.

所需的输出是第三列,称为dates

<index>    text                                  dates
0          My birthday is 10/23/89.               10/23/89
1          Christmas is on December 25.           25 December
2          Thanksgiving of 11/2008 was the best.  11/2008

为了拉出我们的第一次约会,我写了我的第一个 re 表达式,像这样:

df1['dates'] = (df1['text'].str.findall(r'\d{1,2}[/-]\d{1,2}[/-]\d{2 ,4}'))

这就是我卡住的地方。

我不知道/不明白如何编写多个 re 表达式,而不是继续写 df1['dates'] 列中已有的内容。

我想运行下一个表达式:

df1['dates'] = df1['text'].str.findall(r'(?:\d{1,2})?(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z]* (?:\d{1,2}, )?\d{4}')

如何或最好的方法是查看df['dates'] 列是否为空,然后尝试下一个 re 表达式?

我今天早些时候问过这个问题,它被标记为可能与 this 重复,但我认为 DeepSpace 认为我比实际聪明得多,我的问题比他回答的问题更基本。

【问题讨论】:

    标签: python regex pandas dataframe


    【解决方案1】:

    你可以试试

    df['dates'] = df['text'].str.extract('.*?(\d+/\d+/?\d*).*?')
    
    
        text                                    dates
    0   My birthday is 10/23/89.                10/23/89
    1   Christmas is 12/25.                     12/25
    2   Thanksgiving of 11/2008 was the best.   11/2008
    

    添加测试用例:

    df['text'].str.extract('.*?(\d+/\d+/?\d*).*?|\
    (January|February|March|April|May|June|July|August|September|October|November|December \d+)', expand = False)\
    .fillna('').sum(1)
    

    然后你得到

    0       10/23/89
    1    December 25
    2        11/2008
    

    【讨论】:

    • @Vaishiali 谢谢 - 这个表达式有帮助,但是真实的数据集也有一些月份,比如 'Oct'、'October' 所以真正的结果集并不是所有的数字。因此,我认为我仍然需要遍历数据集或获取 '|'运算符对我的数据使用多个正则表达式。
    • 为了清楚起见更新了问题,并在我的数据中包含了一个文本月份以避免混淆。再次感谢您帮助我。
    • @SDS,很难为这种情况编写精确的正则表达式,但无论如何我已经更新了我的答案。在这里,我试图找到两种模式,数字格式的日期或月份名称格式,并使用轴 1 上的 sum 将两者结合起来
    猜你喜欢
    • 1970-01-01
    • 2022-06-23
    • 1970-01-01
    • 2015-08-31
    • 1970-01-01
    • 2021-02-20
    • 2013-05-24
    • 1970-01-01
    • 2019-07-04
    相关资源
    最近更新 更多