如何从Pandas DataFrame字符串列提取信息填充对应列?
高效提取字符串变量到对应列的解决方案
针对200万行的大数据量,必须优先保障性能,同时兼容多样的用户输入格式,这里推荐结合正则表达式与Pandas矢量化操作的方案——核心是避免逐行循环(这是慢处理的主要诱因)。
核心思路
- 用正则匹配所有目标变量的取值,兼容
=、=带空格、:等多种分隔格式 - 采用Pandas矢量化方法批量提取,替代低效的逐行apply
- 提取后填充对应列,保留原有非空值
具体实现步骤
1. 定义正则匹配规则
针对每个变量(比如Info A对应标识A),编写通用正则,精准匹配"变量名+任意分隔符+数值"的模式:
import pandas as pd import re # 变量映射:键为目标列名,值为匹配该变量的正则表达式 var_mapping = { 'Info A': r'A\s*[=:]\s*([\d.]+)', # 兼容A=xx、A = xx、A:xx等格式,捕获数字部分 'Info B': r'B\s*[=:]\s*([\d.]+)' }
2. 批量提取并填充列值
利用str.extract进行矢量化提取(速度是apply的数十倍),再填充到原有列的空值位置:
# 遍历每个变量,完成提取与填充 for col, pattern in var_mapping.items(): # 提取数值并转为浮点型,空值保留NaN extracted_vals = df['String'].str.extract(pattern, expand=False).astype(float) # 仅填充目标列的空值,保留原有非空数据 df[col] = df[col].fillna(extracted_vals)
3. 带单位值的处理(可选)
如果部分取值带单位(比如10m),可以调整正则捕获完整内容:
# 捕获数字+单位的正则 pattern_with_unit = r'A\s*[=:]\s*([\d.]+[a-zA-Z]?)' extracted_with_unit = df['String'].str.extract(pattern_with_unit, expand=False)
4. 性能优化建议
- 优化正则:避免过度贪婪匹配(比如用
\d+替代.*),提升匹配速度 - 类型优化:将
String列转为Pandas的StringDtype(1.0+版本支持):df['String'] = df['String'].astype('string') - 分块处理:若内存不足,用
pd.read_csv(chunksize=100000)分块读取处理,最后合并结果
示例验证
用你提供的测试数据测试:
# 构造测试DataFrame data = { 'String': ["'some text'", "'A=70, B=80, text'", "'text, A = 10m, B:20'"], 'Info A': [50, None, None], 'Info B': [60, None, None] } df = pd.DataFrame(data) # 执行提取填充 var_mapping = { 'Info A': r'A\s*[=:]\s*([\d.]+)', 'Info B': r'B\s*[=:]\s*([\d.]+)' } for col, pattern in var_mapping.items(): extracted_vals = df['String'].str.extract(pattern, expand=False).astype(float) df[col] = df[col].fillna(extracted_vals) print(df)
输出结果:
String Info A Info B 0 'some text' 50.0 60.0 1 'A=70, B=80, text' 70.0 80.0 2 'text, A = 10m, B:20' 10.0 20.0
内容的提问来源于stack exchange,提问作者lsdnts
相关产品推荐
相关产品推荐

