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

如何将DataFrame行转为MultiIndex层级?CSV数据结构转换

问题需求

我有一个格式如下的CSV文件:

ID ; name; location; level; DATE19970901; DATE19970902; ...;DATE20201031;survey;person
001;  foo;     east;   500;        123.1;        342.5; ...;       234.5;     A;  John
002;  bar;     west;    50;         67.8;         98.3; ...;        76.6;     A;  Jenn
003;  baz;    north;  5000;        535.7;         99.9; ...;       432.6;     B;  John

需要将其转换为如下结构的DataFrame:

ID         001    002   003
name       foo    bar   baz
location   east   west  north
level      500    50    5000
survey     A      A     B
person     John   Jenn  John
date
1997-09-01 123.1  67.8  535.7 
1997-09-02 342.5  98.3  99.9
...
2020-10-31 234.5  76.6  432.6

我尝试读取文件后用.transpose()转置DataFrame,想把特定行(0、1、2、8443、8444)设为MultiIndex层级,但没找到合适方法。MultiIndex.from_frame只能把完整DataFrame转成MultiIndex,拆分合并的方法复杂容易出错,转置后导出再读取的方式不够规范,希望找个简便的实现方法。

解决方案

可以按以下步骤操作,无需复杂拆分:

  1. 读取CSV文件:指定分隔符为;,同时保留ID列的字符串格式,避免被自动转为数字,并用skipinitialspace=True处理字段中的前置空格
import pandas as pd

df = pd.read_csv('your_file.csv', sep=';', dtype={'ID': str}, skipinitialspace=True)
  1. 拆分静态列与日期列:将非日期的静态信息列和日期数据列分开处理
# 定义静态信息列
static_cols = ['ID', 'name', 'location', 'level', 'survey', 'person']
# 筛选所有以DATE开头的日期列
date_cols = [col for col in df.columns if col.startswith('DATE')]

# 处理静态信息:转置后以ID列为列名
static_df = df[static_cols].set_index('ID').T
# 处理日期数据:转置后保留ID作为列名
date_df = df.set_index('ID')[date_cols].T
  1. 格式化日期索引:将DATEYYYYMMDD格式的索引转换为YYYY-MM-DD,并设置索引名为date
date_df.index = date_df.index.str.replace('DATE', '').str.replace(r'(\d{4})(\d{2})(\d{2})', r'\1-\2-\3', regex=True)
date_df.index.name = 'date'
  1. 合并结果:将静态信息和日期数据拼接,得到目标结构的DataFrame
result = pd.concat([static_df, date_df])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 09:30:32