Pandas如何拆分DataFrame文本列键值对到对应新列并转数值类型
Pandas拆分键值对列并自动转数值类型实现方案
核心思路
针对CODES列里分号分隔的键值对格式,逐行清理脏字符、拆分键值、自动识别转换数值类型,最后和原表保留列拼接得到目标结果,对不规范的空格、末尾多余逗号有较好的容错性。
可直接运行的完整代码
import pandas as pd import numpy as np # 构造原始示例DataFrame data = {'CODES': ['ABC=V; XZE=6,0; FYK=5,0', 'RTK=6,0;XZE=6,0', 'FYK=5,0; RTK=6,0;ABC=V,'], 'CUSTOMER': ['CUSTOMER1','CUSTOMER2,','CUSTOMER3',] } CUSTOMERCODES = pd.DataFrame(data) # 定义逐行拆分处理函数 def parse_code_col(row): # 按分号拆分键值对,清理前后空格、末尾冗余逗号 kv_list = [item.strip().rstrip(',') for item in row['CODES'].split(';')] parsed = {} for kv in kv_list: if '=' not in kv: continue # 按等号拆分键和值,只拆分一次避免值内包含等号的异常 key, val = kv.split('=', 1) key = key.strip() val = val.strip().rstrip(',') # 替换欧式小数的逗号为点,尝试转浮点型 val = val.replace(',', '.') try: val = float(val) except ValueError: # 转换失败则保留原始字符串值 pass parsed[key] = val return pd.Series(parsed) # 应用拆分函数,拼接保留的CUSTOMER列 parsed_codes = CUSTOMERCODES.apply(parse_code_col, axis=1) CUSTOMERCODES2 = pd.concat([parsed_codes, CUSTOMERCODES[['CUSTOMER']]], axis=1)
关键处理细节
- 提前做字符清理:统一处理键值对前后的不一致空格、末尾多余逗号(比如示例数据中
ABC=V,末尾的冗余逗号、XZE=6,0前的空格),避免拆分出错 - 数值自动转换:把欧式格式小数的逗号替换为点号后,用异常捕获逻辑判断值是否可转为数值,可转的统一转为
float类型,不可转的文本值(比如示例里的V)保留原字符串格式 - 缺失值自动填充:某行不存在的编码键会自动填充
np.NaN,和目标结构完全匹配
输出结果校验
运行后得到的CUSTOMERCODES2结构和预期完全一致:
- ABC列:
['V', np.NaN, 'V'] - XZE列:
[6.0, 6.0, np.NaN] - FYK列:
[5.0, np.NaN, 5.0] - RTK列:
[np.NaN, 6.0, 6.0] - CUSTOMER列:保留原始值无修改
内容的提问来源于stack exchange,提问作者j_90
相关产品推荐
相关产品推荐

