Python Dataframe索引设置:高中出勤行为数据处理求助
高中出勤数据的DataFrame索引配置方案
实操步骤
假设你的Excel原始表头包含两行合并/分组信息(对应date和period name),按以下步骤处理:
1. 先完整读取原始数据
先不预设表头,把整个表读进来确认结构:
import pandas as pd # 替换成你的Excel文件路径 df_raw = pd.read_excel("attendance_data.xlsx", header=None) # 先看前几行结构,确认表头和数据的分界 print(df_raw.head())
2. 清理冗余行/列
- 删掉顶部的标题行、空行(比如原始表第一行是"高中出勤统计"这类无关内容,直接
df_raw = df_raw.drop([0])) - 删掉全空的列,避免干扰:
df_raw = df_raw.dropna(axis=1, how="all")
3. 构建双层列索引
假设原始表的第0行是date(比如2024-09-01重复对应不同时段),第1行是period name(比如Period 1/Period 2),前3列的表头在第1行:
# 提取后面列的双层索引:date行+period行 date_list = df_raw.loc[0, 3:].tolist() period_list = df_raw.loc[1, 3:].tolist() multi_cols = pd.MultiIndex.from_tuples(zip(date_list, period_list), names=["date", "period name"]) # 提取前3列的表头和所有数据行 main_col_names = df_raw.loc[1, :2].tolist() data_rows = df_raw.loc[2:, :].values # 组装最终DataFrame df_final = pd.DataFrame(data_rows, columns=main_col_names + list(multi_cols)) # 把出勤百分比转成数值类型(按需调整) df_final["Percent Attendance"] = pd.to_numeric(df_final["Percent Attendance"])
4. 最后验证结构
打印列索引确认是否符合要求:
print(df_final.columns)
输出里前3列是普通列名,后面会显示MultiIndex([('2024-09-01', 'Period 1'), ...], names=['date', 'period name'])
关键提示
- 如果你的原始表头行位置不同,比如date在第1行、period在第2行,就把代码里的
loc[0]、loc[1]对应调整 - Excel里的合并单元格会被pandas自动填充重复值,刚好适合date层的索引构建
- 多练
loc切片、MultiIndex这类原生方法,比手动写Array高效得多
内容的提问来源于stack exchange,提问作者Graham G
相关产品推荐
相关产品推荐

