如何用Pandas读取含多分隔符的多索引CSV文件?
解决Pandas读取多索引分组键值对数据的问题
看起来你遇到的问题是原始数据的结构不是标准表格格式,直接用read_csv的分隔符参数没法一步生成多索引——毕竟你的数据是按组(A、B)打包了多个键值对,每个键值对用:分隔,组内的键值对用\t分隔,这种嵌套结构需要先预处理再重组。
我来给你一步步拆解解决方案:
核心问题分析
直接用sep='[:\t]'会把所有:和\t都当成分隔符,导致列被拆得七零八落(比如one : some data会被拆成one、空字符串、some、data),完全没法区分组名、键和值。而header=[0,1]和tupleize_cols是给有双层表头的标准表格用的,你的数据结构不匹配,所以没用。
解决方案:先拆分再重组
假设你的原始数据文件data.txt内容是这样的(用\t分隔键值对):
A one : some data two : some other data B one : foo three : bar
我们可以分三步处理:
1. 按\t读取,拆分组和键值对列
先把每行的组名和后续的键值对字符串分开:
import pandas as pd # 读取数据,按\t分割,无表头 df = pd.read_csv('data.txt', sep='\t', header=None)
这时候df的第一列是组名(A/B),后面的列是key : value格式的字符串。
2. 把列转成行,拆分键和值
用melt把多列的键值对转成单行,再拆分键和值:
# 把组名以外的列转成行,去掉空值 melted = df.melt(id_vars=0, var_name='_', value_name='kv_pair').dropna(subset=['kv_pair']) # 拆分键和值(只拆第一个:,避免值里有:的情况) melted[['key', 'value']] = melted['kv_pair'].str.split(' : ', n=1, expand=True)
3. 构建多索引并整理结构
把组名和键设为双层索引,再转成宽表(可选,看你需求):
# 设置多索引 result = melted.set_index([0, 'key'])['value'] # 如果需要转成宽表(每个键作为列) result_wide = result.unstack(fill_value='') # 给索引命名,更清晰 result_wide.index.names = ['group', ''] result_wide.columns.name = 'keys' print(result_wide)
输出结果会是这样的:
keys one three two group A some data some other data B foo bar
现在你就可以轻松按组切片了,比如result_wide.loc['A']就能拿到A组的所有数据。
简化情况:如果数据是每行一个键值对
如果你的原始数据能改成每行一个键值对的格式:
A one some data A two some other data B one foo B three bar
那可以直接一步到位:
df = pd.read_csv('data.txt', sep='\t', header=None, index_col=[0,1])
这样直接就生成了以(组名,键)为双层索引的DataFrame。
内容的提问来源于stack exchange,提问作者Noise in the street
相关产品推荐
相关产品推荐

