Python:如何将宽DataFrame按相邻列对拆分为子数据集?
拆分成对列的宽DataFrame解决方案
问题场景
你有一个包含N列的宽DataFrame,列以两两成对的形式排列:每对的第一列是债券的日期序列,第二列是对应债券的历史价格,依次类推。需要将其拆分为N/2个子DataFrame,每个子DataFrame包含一对相邻列。
你的原代码出现索引错误,问题出在两处:
- 循环范围和步长错误:
range(0,len(df.columns)+1)会遍历所有列索引,没有按每2列一组的逻辑走 - 列切片错误:
i:i+3会取出3列,而你需要的是每2列一组,应该用i:i+2
正确实现代码
基础版本(直接拆分)
sub = {} # 按步长2遍历列索引,每次处理一对列 for idx, i in enumerate(range(0, len(df.columns), 2)): # 取当前索引i到i+2的列(iloc切片左闭右开,i:i+2正好是2列) sub[f"bond_{idx+1}"] = df.iloc[:, i:i+2]
- 用
enumerate生成子DataFrame的序号,命名为bond_1、bond_2...,比用原索引更直观 range(0, len(df.columns), 2)确保每次跳过2列,正好覆盖所有成对列
优化版本(重命名列增强可读性)
如果想让子DataFrame的列名更清晰,可以在拆分时重命名列:
sub = {} for idx, i in enumerate(range(0, len(df.columns), 2)): subset = df.iloc[:, i:i+2] # 重命名列:第一列保留ISIN作为日期列标识,第二列改为"price" subset.columns = [f"{subset.columns[0]}_date", "price"] sub[f"bond_{idx+1}"] = subset
比如拆分后的bond_1列名会变成XS0552790049_date和price,更易理解。
验证
拆分后可以通过sub["bond_1"]查看第一个子DataFrame,结果就是你需要的包含["XS0552790049","Unnamed: 5583"]的数据集。
内容的提问来源于stack exchange,提问作者Emanuele Pizzochera
相关产品推荐
相关产品推荐

