【问题标题】:pandas - regex to extract text, return whole text if pattern not found [duplicate]pandas - 正则表达式提取文本,如果找不到模式则返回整个文本[重复]
【发布时间】:2020-11-12 14:55:45
【问题描述】:

编辑:又更新了一部分问题

我有一个熊猫数据框“数据”,如下所示:

col1
-----
sample data1(xyz)
sample data2(xyz123)
sample data3
sample data4

我想根据上面的列创建一个新列,其中包含左括号“(”之前的文本。 但是,如果该行不包含括号,则应该获取原始文本。

我有以下基于 str.extract 函数的代码:

data["NewCol"] =data["col1"].str.extract("(.*?)\(")

当前结果(如果未找到模式,则输入 NaN。):

NewCol
-----
sample data1
sample data2
NaN
NaN

预期结果(如果没有找到模式,应该放原文):

NewCol
-----
sample data1
sample data2
sample data3
sample data4

我怎样才能得到预期的结果?必须有一种方法可以在一个命令中完成它,它的 python!在这里需要一些帮助!

注意:实际上并不需要使用提取功能。如果其他一些功能可以解决问题,那对我来说很好。

编辑: 第 2 部分

对于同一个数据集,如果我想对括号之间的文本执行类似的操作怎么办?

我的代码:

data["NewCol"] =data["col1"].str.extract("\((.*?)\)")

当前结果(如果未找到模式,则输入 NaN。):

NewCol
-----
xyz
xyz123
NaN
NaN

预期结果(如果没有找到模式,应该放原文):

NewCol
-----
xyz
xyz123
sample data3
sample data4

正则表达式可以解决这个问题吗?

【问题讨论】:

  • 随着更新,您想问什么变得越来越不清楚。请尝试在每个帖子中使用一个问题,如果您必须进行大量修改,请提出一个新问题。

标签: python regex pandas dataframe


【解决方案1】:

你可以replace尾部空字符串:

df['col1'].str.replace('\(.+$', '')

输出:

0    sample data1
1    sample data2
2    sample data3
3    sample data4
Name: col1, dtype: object

或者提取开头的非(字符:

df['col1'].str.extract("^([^\(]+)")

输出:

              0
0  sample data1
1  sample data2
2  sample data3
3  sample data4

【讨论】:

  • 这个解决方案很成功,我在类似场景的问题中又增加了一部分,但对于括号之间的文本。你也可以帮我吗?
  • 最简单的就是用`fillna(df['col1']'链接你已经拥有的东西
  • 我明白,这是有道理的。你的意思是这样的: df["NewCol"] =df["col1"].str.extract("\((.*?)\)").fillna(df["col1"])?这似乎不起作用。对于 NaN,它将第 0 行上的文本从“col1”填充到两个 NaN。奇怪的?两个 NaN 的新值是 - 样本 data1(xyz)
【解决方案2】:

使用您提供的示例数据,您不需要正则表达式,而是可以使用Series.str.split

In [1764]: df.col1.str.split('(').str[0]
Out[1764]: 
0    sample data1
1    sample data2
2    sample data3
3    sample data4
Name: col1, dtype: object

【讨论】:

  • 此解决方案也可以正常工作。我们能用拆分功能解决第 2 部分(已编辑的问题)吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多