Pandas SettingWithCopyWarning:试图在 DataFrame 中的切片副本上设置值
Posted
技术标签:
【中文标题】Pandas SettingWithCopyWarning:试图在 DataFrame 中的切片副本上设置值【英文标题】:Pandas SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a 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)
我该如何解决?
【问题讨论】:
【参考方案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)
【讨论】:
以上是关于Pandas SettingWithCopyWarning:试图在 DataFrame 中的切片副本上设置值的主要内容,如果未能解决你的问题,请参考以下文章