pd.read_csv读取文本文件列错位致NaN,求代码修改方案
Pandas读取文本文件列错位(第二列全为NaN)的解决方法
问题场景
使用Pandas的pd.read_csv读取含两列数据的文本文件时,出现列错位,第二列数据全部显示为NaN。
原代码:
import pandas as pd filename = r'data.txt' #read text file into pandas DataFrame df = pd.read_csv( filename, sep="\t", skiprows=3, names=['Frequency / MHz', 'S2,1 [SPara1]/abs,dB'], ) df
读取结果示例:
Frequency / MHz S2,1 [SPara1]/abs,dB 0 0.1423125 -... NaN 1 0.146625 -... NaN 2 0.1509375 -... NaN 3 0.15525 -... NaN 4 0.1595625 -... NaN ... ... ... 4059 17.64675 ... NaN 4060 17.651063 ... NaN 4061 17.655375 ... NaN 4062 17.659688 ... NaN 4063 17.664 ... NaN
样本data.txt内容片段:
Frequency / MHz S2,1 [SPara1]/abs,dB ---------------------------------------------------------------------- 0.138 -0.92293553 0.1423125 -0.93264485 0.146625 -0.94201416 0.1509375 -0.95106676 0.15525 -0.95982484
问题原因
- 分隔符错误:原代码指定
sep="\t"(制表符分隔),但实际数据是用多个连续空格分隔,Pandas无法正确拆分列,导致整行内容被归入第一列,第二列无数据显示为NaN。 - 跳过行数不合理:
skiprows=3会跳过前3行(包括第一条数据),导致丢失部分数据。
解决代码
方案一:使用sep='\s+'匹配连续空格
import pandas as pd filename = r'data.txt' df = pd.read_csv( filename, sep='\s+', # 匹配任意数量的连续空白字符 skiprows=2, # 仅跳过表头和分隔线 names=['Frequency / MHz', 'S2,1 [SPara1]/abs,dB'], ) print(df)
方案二:使用delim_whitespace=True(更简洁)
import pandas as pd filename = r'data.txt' df = pd.read_csv( filename, delim_whitespace=True, # 自动识别空白字符作为分隔符 skiprows=2, names=['Frequency / MHz', 'S2,1 [SPara1]/abs,dB'], ) print(df)
修改说明
- 分隔符调整:替换
sep="\t"为sep='\s+'或delim_whitespace=True,让Pandas正确识别多空格分隔的列。 - 跳过行数修正:将
skiprows=3改为skiprows=2,只跳过表头和分隔线,确保所有数据行都被读取。
内容的提问来源于stack exchange,提问作者Jumo
相关产品推荐
相关产品推荐

