如何将多索引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
相关产品推荐
相关产品推荐

