SettingWithCopyWarning

70 阅读2分钟

通常发生在尝试修改DataFrame的子集时,可能会影响原始数据的情况下。这个警告的出现主要是因为Pandas无法确定你是在原始DataFrame上进行操作,还是在其视图(即切片)上进行操作,从而引发了一些不确定性。

在你的情况下,假设 sink_df 是一个DataFrame,你想要为它的某一列(假设是名为 "type" 的列)的所有行赋值为字符串 "下沉"。当使用类似 sink_df["type"] = "A" 这样的语句时,Pandas可能会产生上述警告,因为它不确定是在原始DataFrame上直接操作,还是在其视图上进行操作。

解决方法:

为了避免这个警告,可以使用以下几种方法中的一种:

  1. 使用 .loc[] 方法赋值

    推荐的方法是使用 .loc[] 方法来明确地指定要操作的行和列,这样Pandas就不会误解你的意图。

    sink_df.loc[:, "type"] = "A"
    

    这里的 loc[] 方法中,: 表示所有行,"type" 表示要操作的列,然后将其赋值为 "A"。

  2. 使用 .copy() 创建副本

    如果确实需要修改DataFrame的副本而不影响原始DataFrame,可以使用 .copy() 创建副本,然后对副本进行操作。

    sink_df_copy = sink_df.copy()
    sink_df_copy["type"] = "A"
    

    这种方法会创建一个 sink_df 的副本 sink_df_copy,然后在副本上进行修改,不会影响到原始的 sink_df

  3. 禁用警告

    如果确信操作不会对原始数据造成不良影响,也可以通过设置 pd.options.mode.chained_assignment = None 来暂时禁用这类警告。

    pd.options.mode.chained_assignment = None
    sink_df["type"] = "A"
    

    但是,这种方法并不推荐,因为警告的目的是帮助你避免潜在的错误。

使用 .loc[] 方法是最安全和推荐的方式,因为它明确地告诉Pandas你的意图,并且不会产生误解和警告。