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

新手上路,请多包涵

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

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

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

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

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

原文由 Ricardo Guerreiro 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 878
2 个回答

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

 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]) ,你会得到 4.0 当你做 df.reindex([1,2]).loc[1,'b']

发生的事情是 set_index 已经将之前的索引 (0,1) 替换为 (1,2)(来自“a”列的值),而没有触及“b”列中值的顺序

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

while 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 将使用列的值更改索引,而不会改变索引的顺序数据框中的其他值

原文由 Ben.T 发布,翻译遵循 CC BY-SA 4.0 许可协议

补充一下,撤消到 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

原文由 prosti 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题