假设我有一个这样的数据帧,带有“密集”的第一列和“稀疏”的第二列:
# python 3.7.1, pandas 0.23.4.
import pandas as pd
df = pd.DataFrame({'col1':range(1,5), 'col2': [5, '', 7, '']})
missing_values_index = df[df['col2'] == ''].index
我尝试了两种方法将col1值分配给col2缺失值。
方法1(不起作用,df保持不变):
df.loc[missing_values_index]['col2'] = df.loc[missing_values_index]['col1']
方法2(工作正常):
df.loc[missing_values_index, 'col2'] = df.loc[missing_values_index, 'col1']
我认为这只是写同一件事的两种方式。有人能解释一下这里到底发生了什么吗?
解决办法:核心是当我们尝试将值分配给对象的副本而不是对象本身时。我可以像这样重写你的第一个方法:
something = df.loc[missing_values_index]
something['col2'] = df.loc[missing_values_index]['col1']
现在问题出现了。根据文档,不知道第一行是创建a view还是a copy。这就是它SettingWithCopy发出警告并阻止你分配的原因; 因为如果熊猫不能确定你的作业有效,它就不能让你这样做!