Pandas多行表头DataFrame处理空表头:替换或移除Unnamed标识
解决Pandas多级表头Unnamed标识的问题
这个问题我之前也碰到过,Pandas处理带多行表头的CSV时,确实会自动给原表头里的空值填充Unnamed:x_level_y这类标识,不过有几种简单的方法可以调整,刚好对应你想要的两种输出效果:
方法一:读取后直接修改多级表头
读取数据后,我们可以直接对MultiIndex类型的列名进行替换操作,把Unnamed标识改成空字符串或者你需要的符号。
对应期望输出1(把Unnamed替换为空)
import pandas as pd # 读取数据 df = pd.read_csv('mrh.csv', header=[0,1], na_values=[-1,'']) # 处理多级表头的Unnamed标识 # 遍历每个层级,只处理第二行表头(level=1)的Unnamed内容 new_levels = [] for idx, level in enumerate(df.columns.levels): if idx == 1: cleaned_level = level.str.replace(r'Unnamed: \d+_level_\d+', '', regex=True) else: cleaned_level = level new_levels.append(cleaned_level) # 更新列的层级名称 df.columns = df.columns.set_levels(new_levels) print(df)
运行后就能得到你要的第一种子输出,第二行表头的空值位置会显示为空。
对应期望输出2(把Unnamed替换为'-')
只需要把上面的替换内容从空字符串改成'-'即可:
import pandas as pd df = pd.read_csv('mrh.csv', header=[0,1], na_values=[-1,'']) new_levels = [] for idx, level in enumerate(df.columns.levels): if idx == 1: cleaned_level = level.str.replace(r'Unnamed: \d+_level_\d+', '-', regex=True) else: cleaned_level = level new_levels.append(cleaned_level) df.columns = df.columns.set_levels(new_levels) print(df)
方法二:读取前预处理表头(更直观)
如果觉得读取后修改麻烦,也可以先单独读取表头行,手动处理空值后再读取完整数据:
对应期望输出2的示例
import pandas as pd # 先读取前两行作为表头 header_df = pd.read_csv('mrh.csv', nrows=2) # 把表头里的空值替换为'-'(如果要空就用fillna('')) header_df = header_df.fillna('-') # 把表头转换成MultiIndex multi_columns = pd.MultiIndex.from_frame(header_df.T) # 跳过前两行读取数据,用处理好的MultiIndex作为列名 df = pd.read_csv('mrh.csv', skiprows=2, names=multi_columns, na_values=[-1,'']) print(df)
这种方法更灵活,你可以根据需要自定义表头的每个位置的值,比如给特定列的二级表头设置自定义名称。
内容的提问来源于stack exchange,提问作者Krzysztof Słowiński




