为何df.reset_index().index与df.reset_index()['index']输出不同?
pandas中reset_index()后索引访问的疑问解答
测试代码
import pandas as pd df1 = pd.DataFrame({ "value": [1, 1, 1, 2, 2, 2]}) print(df1) print("-------------------------") print(df1.reset_index()) print("-------------------------") print(df1.reset_index().index) print("-------------------------") print(df1.reset_index()["index"])
运行输出
value 0 1 1 1 2 1 3 2 4 2 5 2 ------------------------- index value 0 0 1 1 1 1 2 2 1 3 3 2 4 4 2 5 5 2 ------------------------- RangeIndex(start=0, stop=6, step=1) ------------------------- 0 0 1 1 2 2 3 3 4 4 5 5 Name: index, dtype: int64
疑问解答
为什么两个输出不同?
这俩语句访问的是完全不同的对象:
df1.reset_index().index:调用reset_index()会生成一个新的DataFrame,.index是DataFrame的内置属性,它指向的是这个新DataFrame自带的默认行索引(也就是输出里最左边无列名的0-5序列),所以打印的是这个索引的类型和参数信息(RangeIndex)。df1.reset_index()["index"]:reset_index()的核心作用就是把原DataFrame的行索引提取出来,转换成一个名为index的新列。这里用方括号是按列名直接访问这个新生成的列,所以打印的是该列的具体数据(一个pandas Series对象)。
访问重置后生成的"index"列必须用方括号吗?
不是必须,还有几种替代写法:
- 使用
.loc索引器:df1.reset_index().loc[:, "index"] - 使用
.get()方法:df1.reset_index().get("index")
⚠️ 注意:这里不能用点语法(比如df1.reset_index().index),因为.index已经被DataFrame的内置索引属性占用了,点语法会优先返回内置索引而非新生成的index列。
内容的提问来源于stack exchange,提问作者24n8
相关产品推荐
相关产品推荐

