如何使用正则表达式基于唯一字符序列解析DataFrame列数据
DataFrame带逗号键值对列解析实现方案
核心实现思路
严格遵循给定的边界判定规则,不直接使用逗号做全局分割:
- 先定位字符串中所有等号的位置
- 从第二个等号开始,向前查找距离当前等号最近的逗号,作为前一个键值对的分割边界
- 按收集到的边界切割字符串,得到完整键值对,最终转为结构化字典格式,方便直接映射为DataFrame列
完整代码
import pandas as pd def parse_kv_str(input_str: str) -> dict: # 收集所有等号的索引位置 eq_indexes = [i for i, c in enumerate(input_str) if c == '='] if not eq_indexes: return {} split_points = [] last_split = 0 # 从第二个等号开始,向前找最近的逗号作为分割点 for eq_idx in eq_indexes[1:]: for i in range(eq_idx - 1, last_split - 1, -1): if input_str[i] == ',': split_points.append(i) last_split = i break # 按分割点切取所有键值对 kv_pairs = [] start = 0 for sp in split_points: kv_pairs.append(input_str[start:sp].strip()) start = sp + 1 kv_pairs.append(input_str[start:].strip()) # 转为键值对字典,兼容值内包含等号的场景 parsed = {} for pair in kv_pairs: if '=' in pair: key, value = pair.split('=', 1) parsed[key.strip()] = value.strip() return parsed # 单字符串测试 if __name__ == "__main__": # 测试用例1 s1 = "NAME=TEST,TEST ID=1234,ENTRY DESCR=Verify,ENTRY CLASS=CCD,TRACE NO=124313523,12414,ENTRY DATE=210506" print(parse_kv_str(s1)) # 输出: {'NAME': 'TEST', 'TEST ID': '1234', 'ENTRY DESCR': 'Verify', 'ENTRY CLASS': 'CCD', 'TRACE NO': '124313523,12414', 'ENTRY DATE': '210506'} # 测试用例2 s2 = "DESCRIPTION=TEST,TEST,TEST" print(parse_kv_str(s2)) # 输出: {'DESCRIPTION': 'TEST,TEST,TEST'}
DataFrame批量应用方法
假设原始DataFrame为df,存储待解析字符串的列名为raw_content,可通过如下代码批量解析并合并为结构化列:
# 批量解析整列,转为结构化列 parsed_cols = df['raw_content'].apply(parse_kv_str).apply(pd.Series) # 合并回原DataFrame final_df = pd.concat([df, parsed_cols], axis=1)
适配说明
- 完全兼容值内自带逗号的场景,不会错误切割值内容
- 键值对拆分时仅按第一个等号切割,可兼容参数值本身包含等号的极端场景
- 无有效等号的异常字符串会返回空值,不会中断批量解析流程
内容的提问来源于stack exchange,提问作者Danny C
相关产品推荐
相关产品推荐

