昨天我花了大量时间试图将熊猫数据框的一个列(columnA)中的值复制到同一数据框中的另一列(columnB)中。这些列是带有数字和NaN值的浮点数。
我研究了该站点,Stack Overflow,Google等,但我尝试的所有操作均失败,什么都不做和/或给了我SettingWithCopyWarning警告。下面的两种方法都可以复制值,但都会发出此警告。
如果有所作为,则columnA来自read_csv操作,而columnB稍后插入。
基本上,我希望获得一些反馈,以了解哪种方法更好,或者是否有一种方法可以使警告不被触发。
for row in df.itertuples():
df['columnB'] = df['columnA']
df['columnB'] = df.apply(lambda row: row['columnA'], axis=1)
答案 0 :(得分:2)
让我们仔细看看。
首先,我们创建一个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_1的df副本,并在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
避免此警告的一种方法是使用“复制”
df_ac = df['a':'c'].copy()
df_ac['X'] = df_ac['B']
否,SettingWithCopyWarning。