【问题标题】:Issue while using Pandas.Series.Apply function with Regular Expressions使用带有正则表达式的 Pandas.Series.Apply 函数时出现问题
【发布时间】:2021-04-14 03:48:22
【问题描述】:

我正在尝试对数据框中的特定列应用正则表达式。

此列称为数据类型“非空对象”的“权重”。 此列中的样本值如下所示 - '250 lbs./ 113.4 kg.'

我的目标是在整个列上应用正则表达式,以便仅提取以磅为单位的重量(在上面的示例中,这将是“250”)。

为此,我使用 Series.Apply 函数对列的每一行应用正则表达式:

import re

k = Df['weight'].apply(re.findall,args=('^([0-9]+)\s+',))

print(k.head())

但由于某种原因,'k' 原来是一个包含 空列表的 Pandas 系列。

我尝试将re.findall 逐一应用于“权重”列中的各个元素,然后它按预期返回输出:

k = re.findall('^([0-9]+)\s+',Df['weight'].iloc[0])
print(k)

如果我们对上述示例值进行尝试,这将返回 ['250'] 的输出。

为什么re.findall 在单独应用于系列元素时可以正常工作,但不能与 Series.Apply 函数一起使用?我不明白为什么我会得到一个充满空列表的系列作为后者的输出。

【问题讨论】:

  • 查看pandas.Series.str.extract pandas.pydata.org/docs/reference/api/…。它提供了一种从正则表达式捕获组创建新列的好方法。
  • 哇,谢谢,这符合我的目的!它正在返回我需要的输出。不过,我仍然想知道为什么我没有使用 re.findall 获得代码的输出...

标签: python dataframe python-re


【解决方案1】:

你需要将一个偏函数传递给apply,或者简单地使用一个lambda

Df['weight'].apply(lambda x:re.findall('^([0-9]+)\s+',x))

【讨论】:

  • 哦,明白了。但是你是说我不应该使用普通函数和 apply(),而应该使用 only 部分函数/lambda?
  • 使用普通函数只能允许位置参数位于序列中的值之后。根据 pandas doc,args 参数采用:在系列值之后传递给 func 的位置参数。这与 findall 不兼容。它应该适用于许多其他情况
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-27
  • 2016-01-31
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多