让我们仔细看看。
首先,让我们创建一个 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。