Почему pandas reindex () не работает на месте? - PullRequest
2 голосов
/ 05 июня 2019

Из документов reindex :

Соответствует DataFrame новому индексу с необязательной логикой заполнения, размещая NA / NaN в местах, не имеющих значения в предыдущем индексе.Новый объект создается, если новый индекс не эквивалентен текущему и copy = False.

Поэтому я думал, что я получу переупорядоченный Dataframe, установив copy=False на месте (!) .Кажется, однако, что я получаю копию и мне нужно снова присвоить ее исходному объекту.Я не хочу возвращать его, если смогу избежать этого ( причина этого в другом вопросе ).

Вот что я делаю:

import numpy as np
import pandas as pd

df = pd.DataFrame(np.random.rand(5, 5))

df.columns = [ 'a', 'b', 'c', 'd', 'e' ]

df.head()

Outs:

          a         b         c         d         e
0  0.234296  0.011235  0.664617  0.983243  0.177639
1  0.378308  0.659315  0.949093  0.872945  0.383024
2  0.976728  0.419274  0.993282  0.668539  0.970228
3  0.322936  0.555642  0.862659  0.134570  0.675897
4  0.167638  0.578831  0.141339  0.232592  0.976057

Reindex дает мне правильный вывод, но мне нужно было бы присвоить его обратно исходному объекту, чего я хотел избежать, используя copy=False:

df.reindex( columns=['e', 'd', 'c', 'b', 'a'], copy=False )

Желаемый вывод после этой строки:

          e         d         c         b         a
0  0.177639  0.983243  0.664617  0.011235  0.234296
1  0.383024  0.872945  0.949093  0.659315  0.378308
2  0.970228  0.668539  0.993282  0.419274  0.976728
3  0.675897  0.134570  0.862659  0.555642  0.322936
4  0.976057  0.232592  0.141339  0.578831  0.167638

Почему copy=False не работает на месте?

Можно ли вообще это сделать?


Работа с python 3.5.3, pandas 0.23.3

1 Ответ

3 голосов
/ 05 июня 2019

reindex является структурным изменением, а не косметическим или трансформирующим.Таким образом, копия всегда возвращается, потому что операция не может быть выполнена на месте (это потребует выделения новой памяти для базовых массивов и т. Д.).Это означает, что у вас есть для присвоения результата, другого выбора нет.

df = df.reindex(['e', 'd', 'c', 'b', 'a'], axis=1)  

Также см. Обсуждение GH21598 .


Единственный случай, когда copy=False на самом деле имеет какое-либо применение, это когда индексы, используемые для переиндексации df, идентичны тем, которые у него уже есть.Вы можете проверить, сравнив идентификаторы:

id(df)
# 4839372504

id(df.reindex(df.index, copy=False)) # same object returned 
# 4839372504

id(df.reindex(df.index, copy=True))  # new object created - ids are different
# 4839371608  
...