Как установить абсолютно новый индекс для панд DataFrame, не основанный на предыдущем отношении индекса к данным? - PullRequest
0 голосов
/ 10 декабря 2018

Как я могу назначить абсолютно новый индекс моим данным без какого-либо отношения к старому индексу?

Я знаю метод reindex

df = pd.DataFrame({'a': [1,2,3,4], 'b': [2,3,4,5]})
df

    a   b
0   1   2
1   2   3
2   3   4
3   4   5

df.reindex([1,2,3,4])

    a   b
1   2.0 3.0
2   3.0 4.0
3   4.0 5.0
4   NaN NaN

... но я просто хочу изменить индекс строки, чтобы получить

    a   b
1   1   2
2   2   3
3   3   4
4   4   5

Примечания:

  1. Я знаю, что могу построить фрейм данных с предварительно заданным индексом, используя конструктор DataFrame.Мне нужно точно изменить существующий DataFrame.
  2. В этом конкретном случае DataFrame.shift может работать - но что, если мне нужно назначить произвольный пользовательский индекс, а не сместить существующий?

Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 10 декабря 2018

Чтобы изменить индекс существующего DataFrame, просто выполните

df.index = [1,2,3,4]

Если вы хотите сделать это с помощью метода, то ответ timgeb, вероятно, лучше всего подходит для этого конкретного случая.Кроме того, вы можете определить свой собственный метод DataFrame следующим образом.

def reindex2(self, newindex, inplace=False):
    if inplace:
        reindexed = self
    else:
        reindexed = self.copy()
    reindexed.index = newindex
    return reindexed
pd.DataFrame.reindex2 = reindex2
del reindex2

Теперь вы можете сделать

df.reindex2([1,2,3,4])

, чтобы получить желаемый результат.

0 голосов
/ 10 декабря 2018

В цепочечных вызовах методов может быть полезно знать трюк, который можно вызвать set_index с несуществующими метками, если вы оберните метки, которые хотите установить в другом списке.

>>> df.set_index([[1, 2, 3, 4]])
   a  b
1  1  2
2  2  3
3  3  4
4  4  5
>>>
>>> df.set_index([['w', 'x', 'y', 'z']])
   a  b
w  1  2
x  2  3
y  3  4
z  4  5

Я действительно не знаю почему это работает.Глядя на документацию set_index, я думаю, что это особый случай создания мультииндекса с одним уровнем, как в последнем примере из документации

df.set_index([[1, 2, 3, 4], 'year'])

но без второго элемента 'year'.

0 голосов
/ 10 декабря 2018

Вы можете передать все, что захотите, df.index, если это коллекция той же длины, что и ваш фрейм данных:

df.index = range(1,5)
>>> df
   a  b
1  1  2
2  2  3
3  3  4
4  4  5

df.index = ['this', 'is', 'an', 'index']
>>> df
       a  b
this   1  2
is     2  3
an     3  4
index  4  5

Кроме того, если бы это был только вопрос о добавлении одного к оригиналуиндекс, вы можете использовать оператор на месте +:

>>> df
   a  b
0  1  2
1  2  3
2  3  4
3  4  5

>>> df.index += 1

>>> df
   a  b
1  1  2
2  2  3
3  3  4
4  4  5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...