如何在pandas数据框中重置索引?

559
我有一个数据框,我从中删除了一些行。结果得到的数据框的索引类似于[1,5,6,10,11],我想将它重置为[0,1,2,3,4]。怎么做呢?
下面的方法似乎可行:
df = df.reset_index()
del df['index']
以下内容无法正常工作:
df = df.reindex()

36
不是重复的问题,只是具有相同答案的不同问题。 - NL23codes
3个回答

1111

DataFrame.reset_index 是您要寻找的功能。如果您不想将其保存为列,请执行以下操作:

df = df.reset_index(drop=True)
如果您不想重新指定:
df.reset_index(drop=True, inplace=True)

122
可以使用inplace=True参数,而无需将数据框重新分配给同一变量。 - alhuelamo
44
请注意,如果 inplace=True,该方法将返回 None。 - alyaxey
1
这解决了我在多次使用 df = df.reset_index() 时出现 ValueError: cannot insert level_0, already exists 的问题。 - Tms91
@mkln,即使使用了drop=True,我已经在两列和行中都增加了。df.reset_index()只能修复行,是否可以用来修复列呢? - Amir
2
@Victor - 如果你不“删除”索引,它会添加一个新的索引,并将旧的索引值保存为数据帧中的一系列。 - Caleb McNevin
显示剩余2条评论

73

其他解决方案是分配 RangeIndexrange

df.index = pd.RangeIndex(len(df.index))

df.index = range(len(df.index))

它更快:

df = pd.DataFrame({'a':[8,7], 'c':[2,4]}, index=[7,8])
df = pd.concat([df]*10000)
print (df.head())

In [298]: %timeit df1 = df.reset_index(drop=True)
The slowest run took 7.26 times longer than the fastest. This could mean that an intermediate result is being cached.
10000 loops, best of 3: 105 µs per loop

In [299]: %timeit df.index = pd.RangeIndex(len(df.index))
The slowest run took 15.05 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 7.84 µs per loop

In [300]: %timeit df.index = range(len(df.index))
The slowest run took 7.10 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 14.2 µs per loop

2
@Outcast Source - 最快的方法是 len(df.index),381纳秒 vs df.shape 1.17微秒。我们有什么遗漏吗? - jezrael
2
这是一个优雅的解决方案来重置索引。谢谢!我发现,如果你尝试将hdf5对象转换为pandas.DataFrame对象,在你可以编辑DataFrame的某些部分之前,你必须重置索引。 - troymyname00
如果你使用df.reset_index(drop=True, inplace=True)来避免复制数据,时间会有很大的变化吗? - Cole

24
data1.reset_index(inplace=True)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接