【问题标题】:Perform Left Search function using Pandas使用 Pandas 执行左搜索功能
【发布时间】:2021-02-19 23:26:12
【问题描述】:

这是我第一个链接到我的第一个 Python 项目的问题。 简单来说,我在 Excel 中有 2 列数据,如下所示(前 6 行):

destination_area   |   destination_code
SG37.D0            |   SG37.D
SG30.C0            |   SG30.C
SG4.A3.P           |   SG4.A
SG15.C16           |   SG15.C
SG35.D02           |   SG35.D
SG8.A5.BC          |   SG8.A

所以在 Excel 中,我使用一个函数通过查找第一个“。”来获取目标代码。在单元格中 & 返回它左边的所有字符,加上 1 个字符:

=IfError(left(E2,search(".",E2)+1),"")

现在我想使用 str.extract 来执行它

df1['destination_code'] = df1['destination_area'].str.extract(r"(?=(.*[0-9][.][A-Z]))", expand = False)  

print(df1['destination_area'].head(6),df1['destination_code'].head(6))

我几乎得到了我需要的东西,但代码仍然可以识别那些有超过 1 个“。”的代码

destination_area   |   destination_code
SG37.D0            |   SG37.D
SG30.C0            |   SG30.C
SG4.A3.P           |   SG4.A3.P
SG15.C16           |   SG15.C
SG35.D02           |   SG35.D
SG8.A5.BC          |   SG8.A5.BC

我认识到我的正则表达式正在理解 {a number + "." 的模式。 + 一个字母},返回“SG4.A3.P”和“SG8.A5.BC”情况下的所有字符。 那么如何修改我的代码呢?或者像 Excel 那样执行代码的更好方法?提前致谢

【问题讨论】:

  • 改用r"(?=(\w+[.][A-Z]))"
  • 完美修改。谢谢!

标签: excel regex pandas


【解决方案1】:

无需前瞻。使用

df1['destination_code'] = df1['destination_area'].str.extract(r"^([^.]+\..)", expand=False)  

proof。注意捕获组,这里返回你需要的值就够了。

解释

--------------------------------------------------------------------------------
  ^                        the beginning of the string
--------------------------------------------------------------------------------
  (                        group and capture to \1:
--------------------------------------------------------------------------------
    [^.]+                    any character except: '.' (1 or more
                             times (matching the most amount
                             possible))
--------------------------------------------------------------------------------
    \.                       '.'
--------------------------------------------------------------------------------
    .                        any character except \n
--------------------------------------------------------------------------------
  )                        end of \1

【讨论】:

  • 我明白了。只是想知道你的和亨利的有什么区别?任何例子都表明两种方法的结果可以产生不同的结果?
  • @CharlieNguyen Henry 的(?=(\w+[.][A-Z])) 是一个零宽度匹配断言,它在字符串中找到一个后跟一个或多个字母、数字或下划线、. 和一个大写字母的位置,捕获这些三个并使用str.extract 输出它们。我建议匹配除点以外的任何字符,然后是点,然后是任何字符,然后返回这个值。我的解决方案是模仿你的公式代码。您可以根据自己的喜好和进一步的要求增强表达。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-12
  • 2021-03-26
  • 2021-12-07
  • 2019-04-28
  • 1970-01-01
  • 1970-01-01
  • 2021-01-28
相关资源
最近更新 更多