Давайте посмотрим на это внимательно.
Сначала давайте создадим фрейм данных 5x5.
df = pd.DataFrame(np.arange(25).reshape(5,-1), index=[*'abcde'], columns=[*'ABCDE'])
df
Выход:
A B C D E
a 0 1 2 3 4
b 5 6 7 8 9
c 10 11 12 13 14
d 15 16 17 18 19
e 20 21 22 23 24
Давайте создадим новый столбец из старого:
df['Z'] = df['A']
df
Выход:
A B C D E Z
a 0 1 2 3 4 0
b 5 6 7 8 9 5
c 10 11 12 13 14 10
d 15 16 17 18 19 15
e 20 21 22 23 24 20
Примечание: нет SettingWithCopyWarnings
Теперь давайте возьмем копию df с именем df_1 и изменим ячейку в df_1, что происходит с df?:
df_1 = df
df_1.loc['a','A'] = 100
print(df_1)
print('\n')
print(df)
Выход:
A B C D E Z
a 100 1 2 3 4 0
b 5 6 7 8 9 5
c 10 11 12 13 14 10
d 15 16 17 18 19 15
e 20 21 22 23 24 20
A B C D E Z
a 100 1 2 3 4 0
b 5 6 7 8 9 5
c 10 11 12 13 14 10
d 15 16 17 18 19 15
e 20 21 22 23 24 20
Примечание: df также изменен!
Теперь давайте возьмем подмножество df, назвав его df_ac:
df_ac = df['a':'c']
df_ac
Выход:
A B C D E Z
a 100 1 2 3 4 0
b 5 6 7 8 9 5
c 10 11 12 13 14 10
Давайте изменим значение в df_ac и посмотрим, что произойдет:
df_ac['X'] = df['B']
Сначала мы получаем SettingWithCopyWarning. Что это значит? Ну, это означает, что в этом случае df не изменился.
df_ac
Выход:
A B C D E Z X
a 100 1 2 3 4 0 1
b 5 6 7 8 9 5 6
c 10 11 12 13 14 10 11
Однако выведите df,
A B C D E Z
a 100 1 2 3 4 0
b 5 6 7 8 9 5
c 10 11 12 13 14 10
d 15 16 17 18 19 15
e 20 21 22 23 24 20
Одним из способов избежать этого предупреждения является использование `copy '
df_ac = df['a':'c'].copy()
df_ac['X'] = df_ac['B']
Нет, SettingWithCopyWarning.