#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. читать это