如何用更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
相关产品推荐
相关产品推荐

