Ваша проблема имеет точно такое же происхождение, как написано в документации на панд, которую вы связали.Посмотрите на минимальный пример, который они там предоставили:
def do_something(df):
foo = df[['bar', 'baz']] # Is foo a view? A copy? Nobody knows!
# ... many lines here ...
foo['quux'] = value # We don't know whether this will modify df or not!
return foo
Проблема в том, что foo
может быть либо копией фрейма данных df
, либо представлением.Если это представление, то изменения foo
также будут влиять на исходный кадр данных df
.Если foo
является копией, то строка foo['quux'] = value
не повлияет на df
.
Как это теперь отразится на вашей проблеме?
Вы начинаете с создания фрейма данныхиз файла *.csv
:
raw_data = pd.read_csv("IMF and BBG Fair Values.csv")
Затем вы выбираете столбцы "IMF_VALUE", "BBG_FV", "IMF_DATE" из кадра данных raw_data
следующим образом:
ISO_TH = raw_data[["IMF_VALUE", "BBG_FV", "IMF_DATE"]]
Теперь это выглядит очень похоже на вторую строку из документации:
foo = df[['bar', 'baz']]
Является ли ваш ISO_TH
представлением или копией raw_data
?Мы не сейчас!Так что же произойдет, если мы изменим столбец ISO_TH
?raw_data
тоже меняется или нет?Мы не делаем сейчас и, следовательно, предупреждаем.
Пример игрушки:
import pandas as pd
import numpy as np
raw_data=pd.DataFrame([[np.inf,22,333,44], [3,4,5,2],[1,2,3,4],[np.inf,0,0,0]],columns=["BBG_FV", "IMF_VALUE", "IMF_DATE", "unused"])
ISO_TH = raw_data[["IMF_VALUE", "BBG_FV", "IMF_DATE"]]
# if we now change ISO_TH, we get a warning
ISO_TH.IMF_VALUE=[0,0,0,0] # SettingWithCopyWarning
Тот факт, что вы создаете промежуточный объект filtered_TH
из ISO_TH
, здесь ничего не меняет.
Как мы можем решить это?Легко, мы читаем документы и делаем то, что там написано!
ISO_TH = raw_data.loc[:,["IMF_VALUE", "BBG_FV", "IMF_DATE"]]
И продолжить, как и раньше.
Дополнительная информация: Какие правила использует Pandas для создания представления против копии?