【问题标题】:Pandas SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFramePandas SettingWithCopyWarning:试图在 DataFrame 中的切片副本上设置值
【发布时间】:2016-02-17 02:18:30
【问题描述】:

在以下情况下,我不断收到主题中的警告:

第 1 步:

df.rename(columns={'one':'one_a'}, inplace=True)

第 2 步:

df.drop(['one', 'two', 'three'], axis=1, inplace=True)

我该如何解决?

【问题讨论】:

    标签: pandas


    【解决方案1】:

    最简单的解决方法(可能是良好的编程习惯)是不进行就地操作,例如

    df2 = df.rename(columns={'one':'one_a'})
    

    【讨论】:

    • 如果我这样做会怎样? df = df.rename(columns={'one':'one_a'})
    • 如果我保持原样,在这些情况下可以忽略警告吗?
    • 可以忽略它,但我建议您将新列名列表分配给df.columns。基本上,df.columns = ['list', 'of', 'new', 'names']。而对于df.drop,最好写成df = df.loc[:,['columns', 'to', 'keep']].copy()
    • @VinceBowdren 好吧,我想这是一个口味问题,但就地操作不能很好地与en.wikipedia.org/wiki/Functional_programming
    【解决方案2】:

    我遇到了类似的问题并解决了以下问题:

    new_df = df.copy()
    new_df.rename(columns={'one':'one_a'}, inplace=True)
    new_df.drop(['one', 'two', 'three'], axis=1, inplace=True)
    

    或者你可以这样做

    df.is_copy = False
    

    您可能正在使用原始 DF 的副本(例如:在此之前您正在操作您的 DF),这就是您收到警告的原因。更多关于副本:

    why should I make a copy of a data frame in pandas

    【讨论】:

    • 这可能是我避免这些警告的新策略——大量.copy()标记到我的操作结束
    【解决方案3】:

    一种解决方法是删除 inplace=True,然后使用:

    df = df.drop(['one', 'two', 'three'], axis=1)
    

    【讨论】:

      猜你喜欢
      • 2018-06-18
      • 1970-01-01
      • 2021-03-05
      • 1970-01-01
      • 2016-09-23
      • 2023-03-11
      • 2018-09-18
      • 2016-08-24
      相关资源
      最近更新 更多