在pandas中,df.reindex()和df.set_index()方法有什么区别?

20

我对这个问题感到困惑,虽然很简单,但我在StackOverflow上没有立即找到答案:

  • df.set_index('xcol') 将列'xcol'变为索引(当它是df的一列时)。

  • df.reindex(myList) 从数据框外部获取索引,例如从另一个名为myList的列表中定义。

但是,df.reindex(myList) 还会将值更改为NAs。一个简单的替代方法是: df.index = myList

希望这篇文章能够澄清它!本文也欢迎补充!

3个回答

24

您可以在一个简单的例子中看到差异。让我们考虑这个数据框:

df = pd.DataFrame({'a': [1, 2],'b': [3, 4]})
print (df)
   a  b
0  1  3
1  2  4

索引值现在是0和1。

如果您使用set_index函数并选择列“a”,那么索引值将变为1和2。如果您执行df.set_index('a').loc[1,'b'],您将会得到3。

现在,如果您想要使用reindex函数,并且使用相同的索引值1和2,例如df.reindex([1,2]),那么当您执行df.reindex([1,2]).loc[1,'b']时,将会得到4.0。

发生的事情是set_index函数已经用列'a'的值替换了先前的索引值(0,1),而不影响列'b'中的数值顺序。

df.set_index('a')
   b
a   
1  3
2  4

reindex改变索引时,会保留列'b'中的值与原始数据框中的索引相关联。

df.reindex(df.a.values).drop('a',1) # equivalent to df.reindex(df.a.values).drop('a',1)
     b
1  4.0
2  NaN
# drop('a',1) is just to not care about column a in my example

最后,reindex 会改变索引的顺序,但不会改变与每个索引相关联的行的值,而 set_index 会使用一列的值更改索引,而不会触及数据框中其他值的顺序。


1
很棒的解释! - prosti
1
简单的使用说明,pandas建议使用at而不是loc进行单元格索引:df.at[1, 'b']。Loc通常用于访问范围。 - ntjess

7

补充一下,set_index 的撤销方法就是使用 reset_index 方法(或多或少):

df = pd.DataFrame({'a': [1, 2],'b': [3, 4]})
print (df)

df.set_index('a', inplace=True)
print(df)

df.reset_index(inplace=True, drop=False)
print(df)

   a  b
0  1  3
1  2  4
   b
a   
1  3
2  4
   a  b
0  1  3
1  2  4

4
除了Ben. T的出色回答外,我想再举一个例子,说明在将索引列重新索引和设置索引时它们之间的区别。
import pandas as pd
import numpy as np
testdf = pd.DataFrame({'a': [1, 3, 2],'b': [3, 5, 4],'c': [5, 7, 6]})

print(testdf)
print(testdf.set_index(np.random.permutation(testdf.index)))
print(testdf.reindex(np.random.permutation(testdf.index)))

输出:

  • 使用set_index函数,当索引列(第一列)被洗牌时,其他列的顺序保持不变。
  • 使用reindex函数,行的顺序会根据索引列的洗牌而相应地改变。
   a  b  c
0  1  3  5
1  3  5  7
2  2  4  6
   a  b  c
1  1  3  5
2  3  5  7
0  2  4  6
   a  b  c
2  2  4  6
1  3  5  7
0  1  3  5

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