Я смущен правилами, которые использует Pandas, когда решает, что выбор из фрейма данных является копией исходного фрейма данных или представлением оригинала.
Если у меня, например,
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']
не.
Есть ли простое правило, которое использует Pandas, которого мне просто не хватает? Что происходит в этих конкретных случаях; и, в частности, как мне изменить все значения (или подмножество значений) в фрейме данных, удовлетворяющем конкретному запросу (как я пытаюсь сделать в последнем примере выше)?
Примечание. Это не то же самое, что этот вопрос ; и я прочитал документацию , но не осведомлен о ней. Я также прочитал «Связанные» вопросы по этой теме, но мне все еще не хватает простого правила, которое использует Pandas, и того, как его применить, например, к изменению значений (или подмножества значений) в кадре данных, который удовлетворяет конкретному запросу.
.query
ВСЕГДА будет возвращать копию из-за того, что она делает (а не из представления), потому что она оценивается n numexpr. Так что я добавлю это к «правилам»