如何在Pandas中合并拆分列名并删除全NaN列
问题描述
使用pd.read_fwf('./temp.txt', colspecs='infer')读取包含空格列名的固定宽度文件时,原本带空格的列名(如Field Name)被错误拆分为多列,其中拆分出的列全为NaN值。需要实现:删除所有全NaN列,并将其列名合并到前一列的列名中,修正被错误拆分的原列名。
示例输入数据:
Type Dec LookupTable Field Name Field Len Start Pos NUM 0 _ sample data 5 1 NUM 0 _ sample data 10 6 CHAR 0 _ sample data 60 16 NUM 0 _ sample data 3 76 CHAR 0 _ sample data 60 79 CHAR 0 _ sample data 60 139 CHAR 0 _ sample data 60 199 CHAR 0 _ sample data 60 259 NUM 0 _ sample data 3 319 CHAR 0 _ sample data 60 322 CHAR 0 _ sample data 60 382 NUM 0 _ sample data 3 442 CHAR 0 _ sample data 60 445
高效实现方案
步骤说明
- 定位所有全NaN的列
- 从后往前遍历这些列(避免修改列名后索引混乱)
- 将当前NaN列的列名合并到前一列的列名中
- 删除当前NaN列
代码实现
import pandas as pd # 读取数据(用户已执行的步骤) df = pd.read_fwf('./temp.txt', colspecs='infer') # 找出所有全NaN的列 nan_cols = df.columns[df.isna().all()] # 从后往前遍历,避免列索引变动影响后续操作 for col in reversed(nan_cols): # 获取前一列的索引和列名 prev_col_idx = df.columns.get_loc(col) - 1 prev_col = df.columns[prev_col_idx] # 合并列名 df.rename(columns={prev_col: f"{prev_col} {col}"}, inplace=True) # 删除当前全NaN列 df.drop(col, axis=1, inplace=True) # 查看处理后的结果 print(df.columns) print(df.head())
关键细节
- 从后往前遍历:如果先处理靠前的NaN列,后续列的索引会因删除操作发生变化,导致定位前一列出错;从后往前遍历则不会有这个问题。
- 列名合并逻辑:直接将NaN列的列名拼接在前一列列名后,还原原本带空格的列名(如
Field+Name→Field Name)。
内容的提问来源于stack exchange,提问作者Arya Stark
相关产品推荐
相关产品推荐

