【问题标题】:extract values between delimiters pandas提取分隔符熊猫之间的值
【发布时间】:2020-07-23 09:57:31
【问题描述】:

我有一个 DF,其中有一列带有这样的字符串:eth 2/2206/114/1/20 我需要提取每个值,因为我使用的是正则表达式。对于我使用的第一个值:

r'eth(.*?)/' 提取eth/ 之间的第一个值

r'/(.*?)/' 提取值2206

但是,如何提取下一个值?我需要忽略第一个定界符'/',无论如何要忽略第一个定界符以在两个下一个斜杠之间提取值 114,或者我怎样才能得到这个输出?

【问题讨论】:

  • 编写一个匹配字符串格式的正则表达式,然后在适当的地方使用捕获组。或者,尝试使用命名捕获组获取所有信息,例如 df['colname'].str.extract(r'^eth\s+(?P<eth>\d+)/(?P<first>\d+)/(?P<second>\d+)/(?P<third>\d+)/(?P<fourth>\d+)$')
  • @WiktorStribiżew 在这里使用更贪婪的正则表达式会更好(如果 / 的数量未知)像 (eth)(.*)(!?\s) 这样 OP 可以在 delim 上拆分并拿走他需要的物品?

标签: python python-3.x regex pandas


【解决方案1】:

一个解决方案:

df = pd.DataFrame([{"my_col": "eth 2/2206/114/1/20"}])
# remove the 'eth' part and save it in an other column
df['my_col_copy'] = df['my_col'].str.extract(r'eth (.*)')
# split in multiple columns
df[['val1', 'val2', 'val3', 'val4', 'val5']] = df['my_col_copy'].str.split('/', expand=True)

输出:

my_col               my_col_copy        val1  val2  val3   val4  val5
eth 2/2206/114/1/20  2/2206/114/1/20    2     2206  114    1     20

【讨论】:

  • 这是偷懒的方式,如果eth 后面有文字,它会捕获它全部
  • 所有字符串的长度相同,所以这足以让我获取其他操作的数据。之后,我删除了那几列。当我写这个问题时,我被阻止了,可能其他选项更好,但这对我来说已经足够了。谢谢
【解决方案2】:

由于没有指定,我假设要提取的值的数量是可变的。

考虑到这一点,我想说正则表达式并不是解决问题的最有效工具,因为 (1) 要匹配的模式不是很复杂,并且 (2) 具有可变数量的值,它是非常困难 - 如果不是不可能的话 - 以有效的方式将它们全部提取出来。

提取这些值的更简单方法是在拼接字符串上使用字符串split() 方法(使用startswith() 进行附加验证,以确保确实存在eth 前缀),以保持' eth ' 出分裂。下面以代码 sn-p 为例:

column = 'eth 2/2206/114/1/20'  # Or any other valid values

if column.startswith('eth '):
    values = column[4:].split('/')
else:
    values = None  # Here, manage the invalid case how you prefer

print(values)

结果:

['2', '2206', '114', '1', '20']

【讨论】:

    猜你喜欢
    • 2014-11-17
    • 2017-04-29
    • 1970-01-01
    • 1970-01-01
    • 2017-10-21
    • 2018-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多