You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将多索引Pandas DataFrame扁平化为单行以通过to_sql存入PostgreSQL数据库

如何将带多层索引的高校数据DataFrame扁平化为单行宽表

我来帮你搞定这个DataFrame扁平化的问题!咱们一步步来,先准确复现原始数据,再把它转换成你需要的单行格式,方便后续用to_sql存入PostgreSQL。

第一步:复现并清理原始DataFrame

首先咱们先把你提供的CSV数据转换成正确的带多层索引的DataFrame,同时清理数值格式:

import pandas as pd

# 读取CSV,指定前3行作为列的多层索引,第一列作为行索引
df = pd.read_csv('path/to/example.csv', header=[1, 2, 3], index_col=[0])

# 删除第一列(空的列)
df = df.drop(df.columns[0], axis=1)

# 清理数值:去掉数字里的逗号,转成数值类型(空值自动转为NaN)
df = df.replace(',', '', regex=True).apply(pd.to_numeric, errors='coerce')

# 过滤掉所有值都是空的行(比如"All other undergraduates enrolled in credit courses"这一行)
df = df.dropna(how='all')

这一步处理后,咱们得到的df行索引是各类学生群体,列是三层MultiIndex:(就学类型, 性别, 学历层次),数值也都变成了可计算的格式。

第二步:扁平化生成单行宽表

接下来咱们把行索引和列的多层索引拼接成新的列名,然后将所有值平铺成一行:

# 初始化字典存储扁平化后的列名和对应值
flat_data = {}

# 遍历每一行和每一列的组合
for student_group in df.index:
    for (enroll_type, gender, level) in df.columns:
        # 拼接新列名:就学类型 + 性别 + 学历层次 + 学生群体,用空格分隔
        new_col_name = f"{enroll_type} {gender} {level} {student_group}"
        # 获取对应单元格的值
        cell_value = df.loc[student_group, (enroll_type, gender, level)]
        # 添加到字典中(用列表包裹,方便后续转DataFrame)
        flat_data[new_col_name] = [cell_value]

# 转换成单行的DataFrame
flat_df = pd.DataFrame(flat_data)

验证结果

现在你打印flat_df,就会得到和你给出的目标结构完全一致的单行DataFrame了!所有原始单元格都对应到了新的列中,空值会显示为NaN(对应你目标里的None,Pandas中二者等价)。

之后你就可以直接用flat_df.to_sql()方法把这个单行数据存入PostgreSQL数据库啦。

内容的提问来源于stack exchange,提问作者Verbal_Kint

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 15:47:36