Python 3.4与3.6中pandas set_index函数差异及修复咨询
问题描述
我有一个名为Value的pandas DataFrame,初始数据如下:
Value: Tenor CurrPrice 0 on 0.123 1 1b 0.234 2 tn 0.456 3 1w 0.678
在Python 3.4环境下执行Value.set_index('Tenor', inplace=True)后,结果为:
Value CurrPrice Tenor on 0.123 1b 0.234 tn 0.456 1w 0.678
但在Python 3.6环境下执行相同代码后,索引值被添加了小括号和逗号,结果如下:
Value CurrPrice Tenor (on,) 0.123 (1b,) 0.234 (tn,) 0.456 (1w,) 0.678
这种差异导致业务流程出现问题,现咨询两个问题:
- 为何会出现该差异?
- 如何修改Python 3.6环境下的输出,使其与Python 3.4的结果一致?
解答
1. 差异原因
核心原因是pandas版本迭代带来的逻辑变更,和Python 3.4/3.6语言本身无关:
- 对应Python 3.4的早期pandas版本(如0.19.x及更早),将单列设置为索引时,默认生成普通的
Index对象,直接显示索引值本身。 - 对应Python 3.6的较新pandas版本(如0.20+),若
set_index的参数被隐性识别为元组(比如代码中存在未察觉的类型转换,或是版本对参数处理逻辑调整),会生成MultiIndex(多级索引)——即使只有一级,也会以(值,)的元组格式展示。
2. 修复方案
以下几种方法都能让Python 3.6环境下的结果和Python 3.4一致:
- 方法一:显式创建普通索引
设置索引时,直接用pd.Index包装目标列,强制生成普通索引:import pandas as pd Value.set_index(pd.Index(Value['Tenor']), inplace=True) - 方法二:转换已有多级索引
如果已经生成了带元组的索引,提取索引的第一级值重新赋值:Value.index = Value.index.get_level_values(0) - 方法三:确保列类型正确
先检查Tenor列的类型,若为元组则转换为字符串,再设置索引:Value['Tenor'] = Value['Tenor'].astype(str) Value.set_index('Tenor', inplace=True)
内容的提问来源于stack exchange,提问作者Sumit Chouhan
相关产品推荐
相关产品推荐

