我对这个问题感到困惑,虽然很简单,但我在StackOverflow上没有立即找到答案:
df.set_index('xcol')
将列'xcol'
变为索引(当它是df的一列时)。df.reindex(myList)
从数据框外部获取索引,例如从另一个名为myList
的列表中定义。
但是,df.reindex(myList)
还会将值更改为NAs。一个简单的替代方法是: df.index = myList
希望这篇文章能够澄清它!本文也欢迎补充!
我对这个问题感到困惑,虽然很简单,但我在StackOverflow上没有立即找到答案:
df.set_index('xcol')
将列'xcol'
变为索引(当它是df的一列时)。
df.reindex(myList)
从数据框外部获取索引,例如从另一个名为myList
的列表中定义。
但是,df.reindex(myList)
还会将值更改为NAs。一个简单的替代方法是: df.index = myList
希望这篇文章能够澄清它!本文也欢迎补充!
您可以在一个简单的例子中看到差异。让我们考虑这个数据框:
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
会使用一列的值更改索引,而不会触及数据框中其他值的顺序。
补充一下,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
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
at
而不是loc
进行单元格索引:df.at[1, 'b']
。Loc通常用于访问范围。 - ntjess