python pandas设置WithCopyWarning副本与新对象



我正在使用通过sub -set of先前创建的dataframe'复制' - 请参见下文:

import random
import pandas as pd
df = pd.DataFrame({'data':list(random.sample(range(10,100),25))})
df_filtered = df.query('data > 20 and data < 80')
df_filtered.rename(columns={'data':'observations'},inplace=True)

问题是,当名为重命名的方法时,我会收到一个setterWithCopy警告,据我了解,我会在原始(在这种情况下)对象的副本(在DF)的副本上操作。警告文本是:"一个值试图在dataframe的切片副本上设置"

我发现了使用不同的子集方法回答的这个问题。我喜欢自己(语法)dataframe.query()方法。有什么方法可以使用.query()方法创建一个新的DataFrame对象,而不是我链接的问题中建议的方法?我尝试了ILOC的一些选择,但没有成功。

您始终可以通过在过滤后的dataframe上调用.copy()来明确制作副本。具体替换

df_filtered = df.query('data > 20 and data < 80')

df_filtered = df.query('data > 20 and data < 80').copy()

是否摆脱了警告?

尝试此而不是使用inplace=True

In [12]: df_filtered = df.query('data > 20 and data < 80')
In [13]: df_filtered = df_filtered.rename(columns={'data':'observations'})

.rename()函数返回一个新对象,因此您只需使用返回的新DF

覆盖DF

如果您使用inplace,以下情况正在发生

来自文档:

Inplace: boolean,默认错误

是否返回新的数据框。如果为true,则忽略复制的价值。

返回:

重命名:dataFrame(新对象)

ps基本上,您应该尝试避免使用inplace=True并使用df = df.function(...)技术

最新更新