SettingWithCopyWarning:试图在DataFrame的切片副本上设置一个值。尝试改用.loc [row_indexer,col_indexer] = value,

时间:2020-10-21 07:27:28

标签: python pandas

这是我的代码,当我尝试运行它时,出现此错误“ SettingWithCopyWarning: 试图在DataFrame的切片副本上设置一个值。 尝试使用.loc [row_indexer,col_indexer] = value代替“ 请帮忙。我该怎么办 ? temp_df是train_df的副本,train_df是主数据帧(Paris_AirBNB)的一部分

    np.random.seed(1)
    
    paris_listings = pd.read_csv("paris_airbnb.csv")
    paris_listings = paris_listings.loc[np.random.permutation(len(paris_listings))]
    stripped_commas = paris_listings['price'].str.replace(',', '')
    stripped_dollars = stripped_commas.str.replace('$', '')
    paris_listings['price'] = stripped_dollars.astype('float')
    train_df = paris_listings.iloc[0:6000]
    test_df = paris_listings.iloc[6000:]
    
    
    def predict_price(new_listing):
        temp_df = train_df.copy()
        temp_df['distance'] = temp_df['accommodates'].apply(lambda x: np.abs(x - new_listing))
        temp_df = temp_df.sort_values('distance')
        nearest_neighbor_prices = temp_df.iloc[0:5]['price']
        predicted_price = nearest_neighbor_prices.mean()
        return predicted_price
    
    
    test_df['predicted_price'] = test_df['accommodates'].apply(lambda x: predict_price(x))
    test_df.head()

2 个答案:

答案 0 :(得分:0)

temp_df.loc[:, 'distance'] = temp_df.loc[:, 'accommodates'].apply(lambda x: np.abs(x - new_listing))

也许将相应的地方修改成这个?您可以尝试一下。

答案 1 :(得分:0)

有多种方法可以“解决”此问题。当前,当您使用test_df = paris_listings.iloc[6000:]时,它的确是原始数据帧的一部分,因此,当您稍后通过添加新列对其进行修改时,Pandas尚不清楚是否会/也可能会修改原始数据帧。 (很可能不会)。

解决方案1 ​​

通过指定以下内容,确保test_df实际上是copy中的paris_listings。 test_df = paris_listings.iloc [6000:]。copy()

根据数据的大小,这最终可能会在内存中复制数据并不必要地占用空间。

解决方案2

确保始终使用documentation中建议的.loc.iloc表示法。这意味着使用:

test_df.loc[:, 'predicted_price'] = test_df.loc[:,'accommodates'].apply(lambda x: predict_price(x))

以及函数内部:

temp_df.loc[:, 'distance'] = temp_df.loc[:, 'accommodates'].apply(lambda x: np.abs(x - new_listing))

解决方案3 (不是真正的解决方案,但可以)

如果您认为这不是一个真正的问题,并且可以忽略该警告,并且该程序实际上修改了原始数据框(如果您要添加的是新列),那么您可以忽略该警告。不建议使用,因为这可能无法预测。