valueerror和settingwithcopy在编写函数以替换原始数据帧中的值时警告错误



我试图编写一个函数,自动替换数据帧中的值。我的目标是,当函数在我指定的属性中找到0.0值时,它会按照我写入的方式对其进行插值。函数如下:


def interpolator(attribute):
rows = newdata[newdata[attribute] == 0.0]
countries = rows['Country']
for i in countries:
countrydata = newdata[newdata['Country'] == i]
a = countrydata[countrydata[attribute] == 0.0]
if a['Year'] == 2015:
pass
else:
a = countrydata[attribute].replace({ 0:np.nan})
b = a.interpolate()
newdata[newdata['Country'] == i][attribute] = b

然而,当我尝试运行此功能时,我首先得到了一个带有copywarning的设置,但它不起作用。当将代码更改为上面的代码时,它开始给出一个值错误:true值不明确。有人能帮我吗?

ps:newdata是我想要替换的值的原始数据帧。attribute参数应该是列名。

您可以进行重构,以便从函数中删除for/循环并将其拆分:

def filter(df, country, col):
mask = (df["Country"] == country) & (df[col] == 0.0) & (df["Year"] != 2015)
filtered_df = df.loc[mask, :]
return filtered_df
def interpolator(filtered_df, original_df, col):
filtered_df[col].replace(to_replace={0: np.nan}, inplace=True)
interpolated_values = filtered_df[col].interpolate()
original_df.loc[original_df["Country"] == country, col] = interpolated_values

然后应该更容易测试,在每一步中,你都会得到你所期望的:

for country in newdata.loc[df[col] == 0.0, "Country"].values:
filtered_df = filter(newdata, country, "col_name")
if not filtered_df.empty:
interpolator(filtered_df, newdata, "col_name")