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
我想知道为什么print(df1.reset_index().index)
和print(df1.reset_index()["index"])
在这种情况下打印不同的东西?后者打印“index”列,而前者打印索引。
如果我们想访问重置索引(列),那么似乎我们必须使用括号?
3条答案
按热度按时间wxclj1h51#
PandasDataFrame中的
.index
属性将始终指向DataFrame的Index(行标签),而不是名为"index"的列。如果我们想访问重置索引(列),那么似乎我们必须使用括号?
可以,或者您可以在重置索引时指定名称,例如:
oxalkeyp2#
首先,当你不指定和索引时,
pandas
使用一个RangeIndex
对象作为 Dataframe 的虚拟索引, Dataframe 是一个numpy数组的集合,这些数组自然地从0、1、2等开始索引。等等......它实际上并没有在内存中创建它的值,如果你打印了原始df1
的索引,它将是一个RangeIndex
,就像df1.reset_index().index
一样。reset_index
有一个可选的drop
参数。默认情况下,panda会获取现有的索引并将其转换为 Dataframe 的一列。这是一个RangeIndex
对象,但必须将其扩展为一个实现的列,以适应df中的其他列。如果您包含drop=True
,则不会有“index”列。重置索引时, Dataframe 始终必须有一些索引,默认值是您看到的虚拟
RangeIndex
。DataFrame有一个快捷方式,其中 * 某些 * 列可以通过属性名而不是项来寻址但是,如果列名不符合python的属性命名规则,或者它与现有属性冲突,则不能以这种方式引用它。
.index
是 Dataframe 索引,因此如果您碰巧也有一个列“index”,你需要通过方括号条目协议来访问它。有人可能会说Pandas不应该允许属性访问路径,因为它不能被一致地使用。* 我 * 不会说(除非我完全会说)。
cxfofazt3#
这样做是因为您打印的是不同的内容:
等同于:
这首先向 Dataframe 添加一个Id索引,然后打印df的实际索引。
相当于
它首先向 Dataframe 添加一个Id索引,但同时保留“index”和“values”列,然后打印名为“Index”的列(不是df的索引)
如果要使“index”列成为索引,必须用途: