Pandas双层表头DataFrame扁平化合并与列名拼接问题求解
你遇到这个问题的核心原因是合并单元格对应的后续列一级列名为空,直接拼接两层列名时会带入空值,才会出现_b2这类不符合预期的结果。你只需要先把第一层列名的空值做向前填充,继承对应合并单元格的一级列名,再进行拼接即可:
修复后代码
import pandas as pd # 处理第一层列名:空值(兼容空字符串、NaN两种空值情况)向前填充,继承前面的一级列名 level0 = df.columns.get_level_values(0).to_series().replace("", pd.NA).ffill() # 取第二层列名 level1 = df.columns.get_level_values(1) # 拼接后赋值为新的列名 df.columns = level0 + "_" + level1
简化一行写法
df.columns = df.columns.to_frame().iloc[:,0].replace("", pd.NA).ffill().str.cat(df.columns.get_level_values(1), sep="_")
逻辑说明
ffill()是pandas的向前填充方法,会将空值替换为该位置之前最近的一个非空值,正好适配合并单元格的取值逻辑:合并单元格仅第一个位置有值,后续空位置均复用该值。填充完成后再拼接两层列名,即可得到a_a1、b_b1、b_b2、c_b1、c_b2的预期结果。
内容的提问来源于stack exchange,提问作者User1837246237842
相关产品推荐
相关产品推荐

