Pandas正则表达式求助:将字符串列拆分为多数值列
解决DataFrame字符串列拆分为多列的问题
核心思路
先通过正则提取每一行中所有的「属性名:数值」对,再将提取结果转换为宽表结构,和原DataFrame索引对齐后得到目标结果。
具体实现代码
import pandas as pd # 构造示例DataFrame df = pd.DataFrame({ 'Dimensions': [ '"Width:2 cm"', '"Diameter: 1.2 cm, Height: 10 cm"', '"Diameter: 3.4cm, Volume: 10cm"' ] }) # 步骤1:去除字符串首尾的引号 df['cleaned'] = df['Dimensions'].str.strip('"') # 步骤2:用正则提取所有属性名和对应数值 # 正则解释: # (\w+):匹配属性名(如Width、Diameter),\w+表示1个以上字母/数字/下划线 # :\s*:匹配冒号,后面跟0个或多个空格(兼容有空格和无空格的情况) # (\d+\.?\d*):匹配数值,支持整数(2、10)和小数(1.2、3.4) extract_df = df['cleaned'].str.extractall(r'(\w+):\s*(\d+\.?\d*)') # 步骤3:转换为宽表结构,属性名为列,数值为对应单元格值 extract_df.columns = ['attribute', 'value'] result_df = extract_df.reset_index().pivot(index='level_0', columns='attribute', values='value') # 步骤4:将结果转换为数值类型,空值保留为NaN(对应题目中的null) result_df = result_df.apply(pd.to_numeric) print(result_df)
代码运行结果
attribute Diameter Height Volume Width level_0 0 NaN NaN NaN 2.0 1 1.2 10.0 NaN NaN 2 3.4 NaN 10.0 NaN
关键细节说明
- 正则表达式
(\w+):\s*(\d+\.?\d*)专门兼容了冒号后有空格和无空格的两种格式 extractall会提取每一行中所有匹配的键值对,避免遗漏多属性的情况pivot方法负责把长表转成宽表,自动对齐原DataFrame的行索引- 最后用
pd.to_numeric把字符串数值转成数值类型,方便后续计算
内容的提问来源于stack exchange,提问作者Movilla
相关产品推荐
相关产品推荐

