pandas中df.reindex()和df.set_index()方法之间的区别

时间:2018-06-07 12:32:28

标签: python-3.x pandas indexing reindex

我对此感到困惑,这很简单,但我没有立即在StackOverflow上找到答案:

  • df.set_index('xcol')使列'xcol'成为索引(当它是df列时)。

  • 但是,
  • df.reindex(myList)从数据框外部获取索引,例如,从我们在其他地方定义的名为myList的列表中获取索引。

我希望这篇文章澄清它!我们也欢迎增加这篇文章!

3 个答案:

答案 0 :(得分:10)

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

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

索引是0和1

如果对{a'列使用set_index,则索引为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已经用(1,2)替换了先前的索引(0,1)(来自列'a'的值),而没有触及'b'列中的值的顺序

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

虽然reindex更改索引,但保留列'b'中的值与原始df中的索引相关联

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 :(得分:2)

只需添加,对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

答案 2 :(得分:2)

除了Ben的出色回答。 T,我想再举一个例子,说明在索引列中使用reindexset_index时它们有何不同

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,在index列(第一列)被随机排列时,其他列的顺序保持不变
  • 使用reindex,行的顺序将根据index列的随机排列进行相应更改。
   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