В общем, когда я получаю это предупреждение
/home/mo/mwe.py:7: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
Я перехожу ко второму ответу о том, как бороться с SettingWithCopyWarning в Pandas, и пытаюсь свести свой код к одному из представленных примеров.
Однако на этот раз я застрял с этим не таким уж минимальным MWE:
import pandas as pd
def edit_df(df):
df["shifted"] = df["base"].shift(-1)
df["diff"] = df["shifted"] - df["base"]
df = df.dropna()
df["match"] = df["diff"] > 1
return df
def main():
df = pd.DataFrame({'base': [1,2]})
df = edit_df(df)
print(df)
main()
Я пытался свернуть его дальше, но предупреждение исчезает, когда я удаляю любой из блоков или вставляю код функции в main. Следовательно, я предполагаю, что предупреждение вызвано комбинацией операций. Но от меня ускользает, почему это так. Судя по этому вопросу, я предполагаю, что я всегда работаю над исходным фреймом данных, как и предполагалось.
Насколько я понимаю, я, вероятно, где-то делаю нарезку, поэтому я попытался разместить loc[: , 'column_name'] везде, где, как я предполагаю, происходит нарезка (edit_df_loc ниже), как предлагается в документации. Изменения вносятся, но предупреждение по-прежнему отображается.
Использование dropna().copy() или dropna(inplace=True) приводит к исчезновению предупреждения. Но я не знаю, почему мне нужно скопировать фрейм данных (нужно ли это делать?), а inplace не следует использовать.
Почему я вижу предупреждение и как его правильно исправить?
Pandas версии 2.3.3
Мне вполне может не хватать терминологии, поэтому указывайте мне на дубликат-цель, который объясняет ситуацию, также высоко ценится.
Для справки, вот некоторые варианты, которые не выдают предупреждение, и моя попытка использовать loc[].
Я каждый раз создаю новый кадр данных, поэтому не должно быть никаких срезов выше по потоку, как предложено здесь.
import pandas as pd
def edit_df(df):
df["shifted"] = df["base"].shift(-1)
df["diff"] = df["shifted"] - df["base"]
df = df.dropna()
df["match"] = df["base"] > 1
return df
def edit_df1(df):
df = df.dropna()
df["match"] = df["base"] > 1
return df
def edit_df2(df):
df["shifted"] = df["base"].shift(-1)
df["diff"] = df["shifted"] - df["base"]
df = df.dropna()
return df
def edit_df3(df):
df["shifted"] = df["base"].shift(-1)
df["diff"] = df["shifted"] - df["base"]
df["match"] = df["base"] > 1
return df
def edit_df_copy(df):
df["shifted"] = df["base"].shift(-1)
df["diff"] = df["shifted"] - df["base"]
df = df.dropna().copy()
df["match"] = df["base"] > 1
return df
def edit_df_loc(df):
df.loc[:, "shifted"] = df.loc[:, "base"].shift(-1)
df.loc[:, "diff"] = df.loc[:, "shifted"] - df.loc[:, "base"]
df = df.dropna()
df.loc[:, "match"] = df.loc[:, "base"] > 1
return df
def main():
df = pd.DataFrame({'base': [1,2]})
df = edit_df_copy(df)
df = pd.DataFrame({'base': [1,2]})
df = edit_df1(df)
df = pd.DataFrame({'base': [1,2]})
df = edit_df2(df)
df = pd.DataFrame({'base': [1,2]})
df = edit_df3(df)
print(df)
main()
Подробнее здесь: https://stackoverflow.com/questions/798 ... de-a-funct