You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动