You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用更Pythonic的方式借助Pandas提取字符串列指定内容?

问题描述

我有如下格式的DataFrame列:

Strings
(costofitem:item0:99.93)
(costofitem:item1:2.64)
(costofitem:item2:6.43)
(costofitem:item3:9.34)
(costofitem:item4:12.63)
(costofitem:item5:13.63)
(costofitem:item6:14.63)
(number:3.3:sometext1)
(number:5.3:sometext2)
(number:5.3:sometext3)
(number:5.5:sometext3)

想要得到如下结果:

name number 
item0 99.93
item1 2.64 
item2 6.43
item3 9.34
item4 12.63 
item5 13.63 
item6 14.63 
number 3.3
number 5.3
number 5.3
number 5.5

我尝试过多次拆分操作,但过程很快变得混乱:

df[['name', 'number']] = df['Strings'].str.split(':', expand=True)

之后还要反复拆分、删除多余内容。请问用Pandas实现该需求的最Pythonic方式是什么?

解决方案

最简洁高效的方式是利用正则表达式提取,直接定位目标字段,避免多次拆分的繁琐操作。

使用str.extract()配合正则表达式,可一次性提取出需要的内容:

import pandas as pd

# 构造示例数据
data = {
    'Strings': [
        '(costofitem:item0:99.93)',
        '(costofitem:item1:2.64)',
        '(costofitem:item2:6.43)',
        '(costofitem:item3:9.34)',
        '(costofitem:item4:12.63)',
        '(costofitem:item5:13.63)',
        '(costofitem:item6:14.63)',
        '(number:3.3:sometext1)',
        '(number:5.3:sometext2)',
        '(number:5.3:sometext3)',
        '(number:5.5:sometext3)'
    ]
}
df = pd.DataFrame(data)

# 用单个正则表达式覆盖两种格式,提取对应字段
df[['name', 'number', 'temp_num']] = df['Strings'].str.extract(r'(?:costofitem:(\w+):(\d+\.\d+)|number:(\d+\.\d+):.*)')

# 填充缺失值:第二类格式的name固定为'number',temp_num的值转存到number列
df['name'] = df['name'].fillna('number')
df['number'] = df['number'].fillna(df['temp_num'])

# 保留目标列并清理临时列
result = df[['name', 'number']].drop(columns=['temp_num'])
print(result)

正则说明

  • (?:costofitem:(\w+):(\d+\.\d+):匹配第一类格式,捕获itemX作为name、后续数字作为number
  • |number:(\d+\.\d+):.*:匹配第二类格式,捕获数字作为临时字段,后续用于填充number列
  • ?:表示非捕获组,仅提取我们需要的括号内内容

运行后就能得到目标结果,无需多次拆分和手动清理,代码简洁易维护。

内容的提问来源于stack exchange,提问作者Schwenk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 18:45:33