我对此感到困惑,这很简单,但我没有立即在StackOverflow上找到答案:
df.set_index('xcol')
使列'xcol'
成为索引(当它是df列时)。
df.reindex(myList)
从数据框外部获取索引,例如,从我们在其他地方定义的名为myList
的列表中获取索引。
我希望这篇文章澄清它!我们也欢迎增加这篇文章!
答案 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'列中的值的顺序1} p>
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,我想再举一个例子,说明在索引列中使用reindex
和set_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