Какие правила используют панды для создания представления и копии?



Я запутался в правилах, которые панды используют при принятии решения о том, что выбор из фрейма данных является копией исходного фрейма данных или представлением на оригинале.



если у меня, например,



df = pd.DataFrame(np.random.randn(8,8), columns=list('ABCDEFGH'), index=range(1,9))


Я понимаю, что a query возвращает копию так, что-то вроде



foo = df.query('2 < index <= 5')
foo.loc[:,'E'] = 40


не повлияет на исходный фрейм данных,df. Я также понимаю, что скалярные или именованные срезы возвращают представление, так что назначения к ним, такие как



df.iloc[3] = 70


или



df.ix[1,'B':'E'] = 222


изменится df. Но я теряюсь, когда дело доходит до более сложных случаев. Например,



df[df.C <= df.B]  = 7654321


изменения df, а



df[df.C <= df.B].ix[:,'B':'E']


нет.



есть ли простое правило, что панды используют, что я просто отсутствует? Что происходит в этих конкретных случаях; и, в частности, как я могу изменить все значения (или подмножество значений) в таблице данных, которые удовлетворяют определенному запросу (как я пытался сделать в последнем примере выше)?





Примечание: это не то же самое как этот вопрос; а я читал документация, но не просвещенных. Я также прочитал" связанные " вопросы по этой теме, но мне все еще не хватает простого правила, которое используют Панды, и как я бы применил его, например, для изменения значений (или подмножества значений) в фрейме данных, который удовлетворяет конкретному запросу.

658   1  

1 ответ:

вот правила, последующее переопределение:

  • все операции генерируют копию

  • если inplace=True предоставляется, он будет изменять на месте; только некоторые операции поддерживают это

  • индексатор, который устанавливает, например,.loc/.ix/.iloc/.iat/.at будет установлен на месте.

  • индексатор, который попадает на объект с одним типом dtyped, почти всегда является представлением (в зависимости от макета памяти это может быть не так, поэтому это не так надежный.) Это в основном для эффективности. (пример сверху для .query этой всегда вернуть копию, как ее оценили numexpr)

  • индексатор, который попадает на объект с несколькими типами dtyped, всегда является копией.

ваш пример chained indexing

df[df.C <= df.B].ix[:,'B':'E']

не гарантируется работа (и, таким образом, вы shoulld никогда этого).

вместо этого:

df.ix[df.C <= df.B, 'B':'E']

как это это быстрее и всегда будет работать

цепная индексация - это 2 отдельные операции python и поэтому не может быть надежно перехвачена пандами (вы часто будете получать SettingWithCopyWarning, но это не 100% обнаруживается либо). Элемент dev docs, который вы указали, предлагают гораздо более полное объяснение.

Comments

    Ничего не найдено.