从含空白的ASCII文件创建DataFrame并将空白转换为NaN的问题
pandas读取带空白占位ASCII文件并合并奇偶行方案
核心问题原因
使用sep="\s+"读取文件时,pandas会将任意长度的连续空白作为单一分隔符,直接跳过空白占位位置,导致空值丢失、列数与原始格式不匹配;使用单空格作为分隔符则会将单个空格识别为分隔符,产生大量无效空列,无法对齐字段。
读取文件保留空白为NaN的实现
优先使用pandas.read_fwf()读取固定宽度对齐的ASCII文件,该方法会按列宽度识别字段,自动保留空白占位为缺失值:
import pandas as pd import numpy as np # 方式1:自动识别列宽,适合对齐规则的ASCII文件 df = pd.read_fwf("你的ASCII文件路径.txt", header=None) # 方式2:手动指定列宽/列边界,适合自动识别不准的场景 # widths参数传入每列的字符宽度 # df = pd.read_fwf("你的ASCII文件路径.txt", widths=[12, 8, 15, 20], header=None) # 也可以用colspecs参数传入每列的起止位置(左闭右开) # df = pd.read_fwf("你的ASCII文件路径.txt", colspecs=[(0,12), (12,20), (20,35), (35,55)], header=None) # 统一空值格式,将剩余的空字符串转为标准NaN df = df.replace(r"^\s*$", np.nan, regex=True)
奇偶行合并实现
读取阶段已保证所有行的列数完全一致,可直接按需求逻辑执行拆分合并:
# 拆分奇数行(第1、3、5...行)和偶数行(第2、4、6...行),重置索引保证对齐 df_first = df.iloc[::2].reset_index(drop=True) df_second = df.iloc[1::2].reset_index(drop=True) # 重命名第二部分的列名,避免合并后冲突 df_second.columns = [f"{col}_row2" for col in df_second.columns] # 横向拼接得到最终结果 df_result = pd.concat([df_first, df_second], axis=1)
内容的提问来源于stack exchange,提问作者joho
相关产品推荐
相关产品推荐

