如何将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,拆分合并的方法复杂容易出错,转置后导出再读取的方式不够规范,希望找个简便的实现方法。
解决方案
可以按以下步骤操作,无需复杂拆分:
- 读取CSV文件:指定分隔符为
;,同时保留ID列的字符串格式,避免被自动转为数字,并用skipinitialspace=True处理字段中的前置空格
import pandas as pd df = pd.read_csv('your_file.csv', sep=';', dtype={'ID': str}, skipinitialspace=True)
- 拆分静态列与日期列:将非日期的静态信息列和日期数据列分开处理
# 定义静态信息列 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
- 格式化日期索引:将
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'
- 合并结果:将静态信息和日期数据拼接,得到目标结构的DataFrame
result = pd.concat([static_df, date_df])
内容的提问来源于stack exchange,提问作者JC_CL
相关产品推荐
相关产品推荐

