Какие правила используют панды для создания представления и копии?
Я запутался в правилах, которые панды используют при принятии решения о том, что выбор из фрейма данных является копией исходного фрейма данных или представлением на оригинале.
если у меня, например,
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']
нет.
есть ли простое правило, что панды используют, что я просто отсутствует? Что происходит в этих конкретных случаях; и, в частности, как я могу изменить все значения (или подмножество значений) в таблице данных, которые удовлетворяют определенному запросу (как я пытался сделать в последнем примере выше)?
Примечание: это не то же самое как этот вопрос; а я читал документация, но не просвещенных. Я также прочитал" связанные " вопросы по этой теме, но мне все еще не хватает простого правила, которое используют Панды, и как я бы применил его, например, для изменения значений (или подмножества значений) в фрейме данных, который удовлетворяет конкретному запросу.
1 ответ:
вот правила, последующее переопределение:
все операции генерируют копию
если
inplace=Trueпредоставляется, он будет изменять на месте; только некоторые операции поддерживают этоиндексатор, который устанавливает, например,
.loc/.ix/.iloc/.iat/.atбудет установлен на месте.индексатор, который попадает на объект с одним типом dtyped, почти всегда является представлением (в зависимости от макета памяти это может быть не так, поэтому это не так надежный.) Это в основном для эффективности. (пример сверху для
.queryэтой всегда вернуть копию, как ее оценилиnumexpr)индексатор, который попадает на объект с несколькими типами dtyped, всегда является копией.
ваш пример
chained indexingdf[df.C <= df.B].ix[:,'B':'E']не гарантируется работа (и, таким образом, вы shoulld никогда этого).
вместо этого:
df.ix[df.C <= df.B, 'B':'E']как это это быстрее и всегда будет работать
цепная индексация - это 2 отдельные операции python и поэтому не может быть надежно перехвачена пандами (вы часто будете получать
SettingWithCopyWarning, но это не 100% обнаруживается либо). Элемент dev docs, который вы указали, предлагают гораздо более полное объяснение.
Comments