如何处理不规则Python DataFrame单列数据,拆分多列并提取SNO?
问题描述
导入的数据格式不规则,所有内容都集中在DataFrame的单列中,数据示例如下:
import pandas as pd # 所有数据均位于一列 df = pd.DataFrame([ "1 CABATT CAR BATTERY VOLTAGE -10.0 200.0", "2 CPTEMP CAR DAS PANEL TEMP C -10.0 200.0", "3 CAPTMA CAR PANEL A TEMP C -10.0 200.0", "205 SPPT4P SPEED INPUT 4 CYCLINDER 0.0 32000.0" ], columns=['raw_data'])
尝试提取前三位数字作为SNO时,使用了以下代码:
# 尝试提取前三位数字作为SNO print(df['raw_data'].str.extract('(?P<SNO>\S\d{3}\S)'))
但输出结果全为NaN:
0 NaN 1 NaN 2 NaN 3 NaN
期望将单列数据拆分为包含SNo、ABBRE、DESCRIPTION、MIN、MAX的多列,目标输出格式如下:
SNo ABBRE DESCRIPTION MIN MAX 0 1 CABATT CAR BATTERY VOLTAGE -10.0 200.0 1 2 CPTEMP CAR DAS PANEL TEMP C -10.0 200.0 2 3 CAPTMA CAR PANEL A TEMP C -10.0 200.0 3 205 SPPT4P SPEED INPUT 4 CYCLINDER 0.0 32000.0
解决方法
你之前的正则表达式问题在于:\S\d{3}\S要求数字前后都是非空白字符,但实际数据中SNO是开头的连续数字(可能1-3位),后面直接跟空格,因此匹配失败。以下是两种可行的处理方案:
方案1:正则分组提取(精准适配格式)
用带命名分组的正则表达式,直接匹配每一部分的规则:
# 定义匹配各列的正则模式 pattern = r'(?P<SNo>\d+)\s+(?P<ABBRE>\w+)\s+(?P<DESCRIPTION>.+?)\s+(?P<MIN>-?\d+\.\d+)\s+(?P<MAX>-?\d+\.\d+)$' # 提取数据 result = df['raw_data'].str.extract(pattern) # 转换列的数值类型 result['SNo'] = result['SNo'].astype(int) result[['MIN', 'MAX']] = result[['MIN', 'MAX']].astype(float) print(result)
正则规则说明:
(?P<SNo>\d+):匹配开头的连续数字作为序号(?P<ABBRE>\w+):匹配序号后的连续字母/数字组合作为缩写(?P<DESCRIPTION>.+?):非贪婪匹配中间的描述文本,直到遇到最后两个数值(?P<MIN>-?\d+\.\d+):匹配带负号的浮点数作为最小值(?P<MAX>-?\d+\.\d+)$:匹配行尾的浮点数作为最大值
方案2:分割后重组(适合格式稳定的场景)
如果数据的分隔符是多个空格,可以先按空格分割,再重组各列:
# 按多个空格分割每行数据,展开为多列 split_data = df['raw_data'].str.split(r'\s+', expand=True) # 重组目标列 result = pd.DataFrame({ 'SNo': split_data[0].astype(int), 'ABBRE': split_data[1], 'DESCRIPTION': split_data.loc[:, 2:-2].apply(' '.join, axis=1), 'MIN': split_data.iloc[:, -2].astype(float), 'MAX': split_data.iloc[:, -1].astype(float) }) print(result)
两种方案都能得到目标结果:正则法更灵活,适合描述文本含空格的复杂场景;分割法更直观,适合数据格式稳定的情况。
内容的提问来源于stack exchange,提问作者Mainland
相关产品推荐
相关产品推荐

