Разница между методами df.reindex() и df.set_index() в пандах
Я был смущен этим, что очень просто, но я не сразу нашел ответ в StackOverflow:
-
df.set_index('xcol')
превращает столбец 'xcol'
в индекс (если он является столбцом df).
-
df.reindex(myList)
берет индексы извне кадра данных, например, из списка с именем myList
который мы определили где-то еще.
Я надеюсь, что этот пост проясняет это! Дополнения к этому посту также приветствуются!
Ответы
Ответ 1
Вы можете увидеть разницу на простом примере. Рассмотрим этот блок данных:
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
в то время как 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
будет изменять индексы со значениями столбца, не касаясь порядка других значений в кадре данных
Ответ 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
Ответ 3
Помимо отличного ответа от Бена. 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