You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Pandas解析CSV首行生成过滤值时得到空DataFrame的问题排查

CSV数据提取问题:空DataFrame原因及解决

问题背景

有一个CSV文件,首行内容如下:

Pyscip_V1.11 Ref: #001=XYZ_0[1234] #50=M3_0[112] #51=M3_1[154] #52=M3_2[254]...

需要提取三列数据:

  • Ref:#后的数值(如001、50)
  • ID:=后的标识(如XYZ_0、M3_0)
  • Num:方括号内的数值(如1234、112)

编写的代码运行后得到空DataFrame,代码如下:

import re
import pandas as pd

header_pattern = r'Pyscip_V(\d+\.\d+) Ref:'

version_match = re.search(header_pattern, first_line.iloc[0, 0])
version_number = version_match.group(1) if version_match else ''

matches = re.findall(r'#(\d+)=(\w+_\d)\[([\d]+)\]', first_line.iloc[0, 0])

parsed_df = []
for match in matches:
    row_dict = {
        'Ref': match[0] if match[0] else '',
        'ID': match[1] if match[1] else '',
        'Ser_No': match[2] if match[2] else ''
    }
    parsed_df.append(row_dict)

new_df = pd.DataFrame(parsed_df)

补充:CSV第三行数据为:

ID Date XYZ_0 M3_0 M3_1 M3_2
1 22.12.2023 12.6 0.5 1.2 2.3

期望输出:

Ref ID Num
001 XYZ_0 1234
50 M3_0 112
51 M3_1 154

问题原因

空DataFrame由两个核心问题导致:

  1. CSV读取方式错误:若未指定header=None,Pandas会将首行(Pyscip_V...)自动识别为列名,而非数据行,导致first_line.iloc[0,0]并非目标处理内容,正则无法匹配。
  2. 正则表达式限制过严:(\w+_\d)强制ID为「字母数字+下划线+单个数字」,若ID格式稍有变化(比如后缀是多位数字)就会匹配失败;更可靠的方式是匹配=和[之间的所有非特殊字符。

另外,代码中列名用了Ser_No,与期望的Num不一致,但这不是空DataFrame的原因。

解决步骤

1. 正确读取CSV

使用header=None参数,保留首行作为数据行:

df = pd.read_csv("your_file.csv", header=None)
first_line = df.iloc[0, 0]

2. 修正正则表达式

将ID的匹配模式改为([^=\[]+),匹配=和[之间的所有有效字符,避免格式限制:

matches = re.findall(r'#(\d+)=([^=\[]+)\[(\d+)\]', first_line)

3. 统一列名

将字典中的Ser_No改为Num,与期望输出一致。

完整修正代码

import re
import pandas as pd

# 读取CSV,不将第一行设为表头
df = pd.read_csv("your_file.csv", header=None)
first_line = df.iloc[0, 0]

# 提取版本号(可选操作)
header_pattern = r'Pyscip_V(\d+\.\d+) Ref:'
version_match = re.search(header_pattern, first_line)
version_number = version_match.group(1) if version_match else ''

# 匹配目标数据
matches = re.findall(r'#(\d+)=([^=\[]+)\[(\d+)\]', first_line)

# 构造结果DataFrame
parsed_data = [{'Ref': m[0], 'ID': m[1], 'Num': m[2]} for m in matches]
new_df = pd.DataFrame(parsed_data)

# 打印结果
print(new_df)

运行结果

Ref      ID   Num
0  001  XYZ_0  1234
1   50   M3_0   112
2   51   M3_1   154
3   52   M3_2   254

内容的提问来源于stack exchange,提问作者dnem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 13:55:22