【问题标题】:Pandas string extract all the matches熊猫字符串提取所有匹配项
【发布时间】:2019-05-10 02:06:39
【问题描述】:

我正在学习熊猫系列字符串方法中的正则表达式操作。我能够从字符串中提取第一个数字,但我的正则表达式与第二个数字不匹配。如何捕获这两个数字?

注意第二行,这里的第二个元素是NAN。

代码:

import pandas as pd
df = pd.DataFrame({'a': ["number 1.23 has 1.2 ",
                         "number 12.2 has 12 "]})

pat = r""".+\s+
(\d+\.\d+)
.+
((?:\d+\.\d+)?)
.+"""


df['a'].str.extract(pat,flags=re.X,expand=True)

给予:

0      1
1.23
12.2

预期:

0    1
1.23 1.2
12.2 NaN

如何修复正则表达式?

我对正则表达式很陌生,所以请体谅并原谅我的无知。

【问题讨论】:

  • docs for findall
  • 使用.str.extractallr'(\d+(?:\.\d+)?)' 正则表达式
  • @WiktorStribiżew Gives 模式不包含捕获组。
  • 试试这个(\d+\.\d+).+(\d+\.\d+)
  • r'(\d+(?:\.\d+)?)' 有一个捕获组。请重试。

标签: python regex pandas


【解决方案1】:

您可以将.str.findall\d+\.\d+ 正则表达式一起使用:

>>> df['a'].str.findall(r"\d+\.\d+").to_frame()
             a
0  [1.23, 1.2]
1       [12.2]

或者,

>>> pd.DataFrame(df['a'].str.findall(r"\d+\.\d+").tolist())
      0     1
0  1.23   1.2
1  12.2  None

模式匹配

  • \d+ - 1 位以上
  • \. - 点
  • \d+ - 1 位以上。

请注意,str.findall 不需要用捕获组包装整个模式,就像 .str.extractall 的情况一样,也可以在这里使用。

【讨论】:

  • 我想要 np.nan 而不是 12 最后一个元素。
  • @MilkyWay007 你什么意思?你只想提取浮点值?
  • 我明白了,df['a'].str.findall(r"(\d+\.\d+)").to_frame()。谢谢。
  • 我的意思是我只想用小数来计算数字,12 没有小数,所以它必须是 np.nan 或空。它是在问题结束部分给出的。
  • pd.DataFrame(df['a'].str.findall(r"\d+\.\d+").tolist())
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-13
  • 1970-01-01
  • 2017-10-01
  • 2020-05-31
相关资源
最近更新 更多