pandas df.index与重置索引后的df[“index”]

toe95027  于 2023-01-19  发布在  其他
关注(0)|答案(3)|浏览(462)
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”列,而前者打印索引。
如果我们想访问重置索引(列),那么似乎我们必须使用括号?

wxclj1h5

wxclj1h51#

PandasDataFrame中的.index属性将始终指向DataFrame的Index(行标签),而不是名为"index"的列。
如果我们想访问重置索引(列),那么似乎我们必须使用括号?
可以,或者您可以在重置索引时指定名称,例如:

df1.reset_index(names='the_index').the_index

# 0    0
# 1    1
# 2    2
# 3    3
# 4    4
# 5    5
# Name: the_index, dtype: int64
oxalkeyp

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不应该允许属性访问路径,因为它不能被一致地使用。* 我 * 不会说(除非我完全会说)。

cxfofazt

cxfofazt3#

这样做是因为您打印的是不同的内容:

print(df1.reset_index().index)

等同于:

df = df1.reset_index()
print(df)

这首先向 Dataframe 添加一个Id索引,然后打印df的实际索引。

print(df1.reset_index()["index"])

相当于

df = df1.reset_index()
print(df["index"])

它首先向 Dataframe 添加一个Id索引,但同时保留“index”和“values”列,然后打印名为“Index”的列(不是df的索引)
如果要使“index”列成为索引,必须用途:

df = df1.set_index("index")

相关问题