【问题标题】:SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead,SettingWithCopyWarning:试图在 DataFrame 中的切片副本上设置值。尝试使用 .loc[row_indexer,col_indexer] = value 代替,
【发布时间】:2023-03-11 01:53:01
【问题描述】:

这是我的代码,当我尝试运行它时,我收到此错误“SettingWithCopyWarning: 试图在 DataFrame 中的切片副本上设置值。 尝试使用 .loc[row_indexer,col_indexer] = value 代替“ 请帮忙。我应该怎么办 ? temp_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()

【问题讨论】:

    标签: python pandas


    【解决方案1】:

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

    解决方案 1

    确保test_df 实际上是copyparis_listings,通过指定: test_df = paris_listings.iloc[6000:].copy()

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

    解决方案 2

    确保您始终使用.loc.iloc 表示法,如documentation 中所建议的那样。这意味着使用:

    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(不是真正的解决方案,但您可以)

    如果您认为这不是一个真正的问题,并且如果程序实际修改了您的原始数据框,您可以忽略和/或取消警告,因为它是您要添加的新列。不推荐,因为这可能无法预测。

    【讨论】:

      【解决方案2】:
      temp_df.loc[:, 'distance'] = temp_df.loc[:, 'accommodates'].apply(lambda x: np.abs(x - new_listing))
      

      也许把对应的地方修改成这个?你可以试一试。

      【讨论】:

        猜你喜欢
        • 2018-10-06
        • 2021-11-30
        • 1970-01-01
        • 2022-11-29
        • 2017-11-28
        • 2018-12-22
        • 2016-02-17
        • 1970-01-01
        相关资源
        最近更新 更多