Изменение фрейма данных pandas, который может быть представлением

#python #pandas

#python #pandas

Вопрос:

У меня есть pandas DataFrame df , который возвращается из функции, и я обычно не знаю, является ли это независимым объектом или представлением другого DataFrame . Я хочу добавить к нему новые столбцы, но не хочу копировать его без необходимости.

 df['new_column'] = 0
  

может выдавать неприятное предупреждение об изменении копии

 df = df.copy()
  

может быть дорогостоящим, если df большой.
Каков наилучший способ здесь?

Комментарии:

1. df[‘new_column’] = 0 не должен вызывать предупреждение imo, может быть, вы сделали копию этого df до этого?

2. s = pd.DataFrame({‘a’:[1,2], ‘b’:[2,3]}) s1=s[s.a> 1] s1[‘c’] = 0 s1[‘c’] = 0 C:Anaconda3libsite-packagesipykernel_main_.py:1 : SettingWithCopyWarning: значение пытается бытьустанавливается на копию фрагмента из фрейма данных. Попробуйте вместо этого использовать .loc[row_indexer,col_indexer] = value См. предостережения в документации: pandas.pydata.org/pandas-docs/stable /… если имя == ‘ main ‘:

3. s1=s[s.a>1] вот где вы создаете проблему

Ответ №1:

вы должны использовать индексатор для создания вашего s1, который имеет:

 import pandas as pd
s = pd.DataFrame({'a':[1,2], 'b':[2,3]})
indexer = s[s.a > 1].index
s1 = s.loc[indexer, :]
s1['c'] = 0
  

следует удалить предупреждение.

Комментарии:

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

2. читать это