Переопределение индекса в объекте Pandas DataFrame
Я пытаюсь повторно индексировать объект pandas DataFrame
, например,
From:
a b c
0 1 2 3
1 10 11 12
2 20 21 22
To :
b c
1 2 3
10 11 12
20 21 22
Я собираюсь сделать это, как показано ниже, и получаю неправильный ответ. Любые подсказки о том, как это сделать?
>>> col = ['a','b','c']
>>> data = DataFrame([[1,2,3],[10,11,12],[20,21,22]],columns=col)
>>> data
a b c
0 1 2 3
1 10 11 12
2 20 21 22
>>> idx2 = data.a.values
>>> idx2
array([ 1, 10, 20], dtype=int64)
>>> data2 = DataFrame(data,index=idx2,columns=col[1:])
>>> data2
b c
1 11 12
10 NaN NaN
20 NaN NaN
Любая идея, почему это происходит?
Ответы
Ответ 1
Почему бы вам просто не использовать метод set_index
?
In : col = ['a','b','c']
In : data = DataFrame([[1,2,3],[10,11,12],[20,21,22]],columns=col)
In : data
Out:
a b c
0 1 2 3
1 10 11 12
2 20 21 22
In : data2 = data.set_index('a')
In : data2
Out:
b c
a
1 2 3
10 11 12
20 21 22
Ответ 2
Если вы не хотите "a" в индексе
В:
col = ['a','b','c']
data = DataFrame([[1,2,3],[10,11,12],[20,21,22]],columns=col)
data
Из:
a b c
0 1 2 3
1 10 11 12
2 20 21 22
В:
data2 = data.set_index('a')
Из:
b c
a
1 2 3
10 11 12
20 21 22
В:
data2.index.name = None
Из:
b c
1 2 3
10 11 12
20 21 22
Ответ 3
Если вы хотите установить индекс без потери столбца, используйте set_index
с drop=False
:
data.set_index('a', drop=False)
a b c
a
1 1 2 3
10 10 11 12
20 20 21 22
Другой вариант - просто установить атрибут index
напрямую, это полезно для приложений, критичных к производительности:
data.index = data['a']
data
a b c
a
1 1 2 3
10 10 11 12
20 20 21 22
Или, если "а" должен быть выдвинут, используйте
data.index = data.pop('a')
data
b c
a
1 2 3
10 11 12
20 21 22
И pop
и присвоение index
являются операциями на месте, в отличие от set_index
который возвращает копию данных. Вот некоторые моменты:
df_ = data.copy()
df = pd.concat([df_] * 10000, ignore_index=True)
%timeit df.set_index('a', drop=False)
%timeit df.index = df['a']
784 µs ± 68 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
132 µs ± 2.12 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
Заметка
Не обманывайте себя параметром inplace=True
. Это просто создает копию данных и присваивает ее обратно исходной переменной. inplace=True
и inplace=False
всегда генерируют копию.
Для справки, чтобы установить индекс для монотонно увеличивающихся целых чисел, вы можете эффективно установить индекс для любого объекта диапазона.
df.index = pd.RangeIndex(len(df))
df.index = range(len(df))
df.index = np.arange(len(df))