Python Pandas - 了解inplace = True

时间:2017-05-10 13:08:21

标签: python pandas in-place

pandas库中,有很多次可以选择更改对象,例如使用以下语句...

df.dropna(axis='index', how='all', inplace=True)

我很好奇返回的内容以及inplace=True传递时与inplace=False时的对象处理方式。

self时是否所有操作都会修改inplace=True?如果inplace=False是立即创建的新对象,例如new_df = self,则会返回new_df吗?

10 个答案:

答案 0 :(得分:44)

传递inplace=True时,数据会重新命名(不返回任何内容),因此您可以使用:

df.an_operation(inplace=True)

inplace=False通过时(这是默认值,因此不是必需的),执行操作并返回对象的副本,因此您可以使用:

df = df.an_operation(inplace=False) 

所以:

if inplace == False:
    Assign your result to a new variable
else
    No need to assign

答案 1 :(得分:26)

我使用它的方式是

# Have to assign back to dataframe (because it is a new copy)
df = df.some_operation(inplace=False) 

或者

# No need to assign back to dataframe (because it is on the same copy)
df.some_operation(inplace=True)

<强>结论:

 if inplace is False
      Assign to a new variable;
 else
      No need to assign

答案 2 :(得分:8)

TLDR; 默认情况下,大多数熊猫函数将结果作为新的Series或DataFrame返回。但是,如果您指定inplace=True,则some functions可以就地更改DataFrame。

例如

df = pd.DataFrame({'a': [3, 2, 1], 'b': ['x', 'y', 'z']})

id(df) # 4829954232    
df = df.reset_index()
id(df) # 4837483968 - df was reassigned to a new DataFrame object 

reset_index返回结果的副本,该副本被分配回df。与此相反,

df = pd.DataFrame({'a': [3, 2, 1], 'b': ['x', 'y', 'z']})

id(df) # 4829806040
df.reset_index(inplace=True)
id(df) # 4829806040 - df was updated in-place

什么也不会返回,但是DataFrame会就地修改。


请勿使用inplace=True

我不建议设置此参数,因为它用途不大。请参阅this GitHub issue,其中建议在API范围内弃用inplace参数。

一个常见的误解是使用inplace=True会导致更高效或更优化的代码。实际上,使用inplace=True 绝对没有性能优势。就地和非就地版本都将创建数据的副本无论如何,而就地版本会自动将副本分配回去。

inplace=True支持方法链接。对比

的工作
result = df.some_function1().reset_index().some_function2()

相反
temp = df.some_function1()
temp.reset_index(inplace=True)
result = temp.some_function2()

要记住的第三点警告是,致电inplace=True 可以触发SettingWithCopyWarning

df = pd.DataFrame({'a': [3, 2, 1], 'b': ['x', 'y', 'z']})

df2 = df[df['a'] > 1]
df2['b'].replace({'x': 'abc'}, inplace=True)
# SettingWithCopyWarning: 
# A value is trying to be set on a copy of a slice from a DataFrame

这可能导致意外行为。谨慎使用!

答案 3 :(得分:1)

inplace参数:

df.dropna(axis='index', how='all', inplace=True)

Pandas中的含义通常是:

1。。熊猫会创建原始数据的副本

2。 ... ...对其进行一些计算

3。 ... ...将结果分配给原始数据。

4。 ... ...删除副本。

正如您在下面的其他答案中所看到的,我们仍然可以有充分的理由使用此参数,即inplace operations,但是如果可以的话,我们应该避免使用它,因为它会产生更多问题,例如:

1。。您的代码难以调试(实际上SettingwithCopyWarning代表警告您可能出现的问题)

2。与方法链接冲突

因此,甚至在某些情况下我们还应该使用它?

绝对可以。如果我们使用熊猫或任何工具处理庞大的数据集,我们很容易面对这样的情况,即一些大数据会消耗我们的整个内存。 为了避免这种不良影响,我们可以使用类似method chaining的技术:

(
    wine.rename(columns={"color_intensity": "ci"})
    .assign(color_filter=lambda x: np.where((x.hue > 1) & (x.ci > 7), 1, 0))
    .query("alcohol > 14 and color_filter == 1")
    .sort_values("alcohol", ascending=False)
    .reset_index(drop=True)
    .loc[:, ["alcohol", "ci", "hue"]]
)

这使我们的代码更紧凑(尽管也更难以解释和调试),并且由于链接的方法与另一种方法的返回值一起使用,因此消耗更少的内存,从而仅产生一个副本数据。我们可以清楚地看到,执行此操作后,我们将消耗 2倍原始数据

或者我们可以使用inplace参数(尽管也更难以解释和调试),我们的内存消耗将为 2 x原始数据,但是此操作后的内存消耗仍为 1 x原始数据,如果有人每当使用庞大的数据集时都能确切知道,那将是一个很大的好处。

最终结论:

除非您不处理大量数据,否则请避免使用inplace参数,并在可能仍使用的情况下注意其可能的问题。

答案 4 :(得分:1)

当尝试使用函数对Pandas数据框进行更改时,如果要将更改提交给数据框,则使用'inplace = True'。 因此,以下代码中的第一行将“ df”中第一列的名称更改为“ Grades”。如果要查看生成的数据库,我们需要调用数据库。

df.rename(columns={0: 'Grades'}, inplace=True)
df

当我们不想提交更改而只打印结果数据库时,我们使用'inplace = False'(这也是默认值)。因此,实际上是在不更改原始数据库的情况下打印具有已提交更改的原始数据库的副本。

为了更加清楚,以下代码执行相同的操作:

#Code 1
df.rename(columns={0: 'Grades'}, inplace=True)
#Code 2
df=df.rename(columns={0: 'Grades'}, inplace=False}

答案 5 :(得分:0)

inplace=True使函数不纯。它更改原始数据帧并返回无。在这种情况下,您会中断DSL链。 由于大多数数据帧功能都返回一个新的数据帧,因此可以方便地使用DSL。像

df.sort_values().rename().to_csv()

使用inplace=True进行的函数调用返回None,并且DSL链断开。例如

df.sort_values(inplace=True).rename().to_csv()

将抛出NoneType object has no attribute 'rename'

与python的内置排序和排序类似。 lst.sort()返回None,而sorted(lst)返回新列表。

通常,除非有特殊原因,否则请勿使用inplace=True。当您必须编写df = df.sort_values()之类的重新分配代码时,请尝试将函数调用附加到DSL链中,例如

df = pd.read_csv().sort_values()...

答案 6 :(得分:0)

如果您不使用inplace = True或使用inplace = False,则基本上可以获取副本。

例如:

testdf.sort_values(inplace=True, by='volume', ascending=False)

将改变结构,数据以降序排列。

然后:

testdf2 = testdf.sort_values( by='volume', ascending=True)

将使testdf2成为副本。值将全部相同,但排序将相反,并且您将拥有一个独立的对象。

然后再给另一列,例如LongMA,您可以这样做:

testdf2.LongMA = testdf2.LongMA -1

testdf中的LongMA列将保留原始值,而testdf2列将保留降级的值。

随着计算链的增长以及数据帧的副本具有其自己的生命周期,保持差异非常重要。

答案 7 :(得分:0)

是的,在Pandas中,我们有许多函数具有参数inplace,但默认情况下它被分配给False

因此,当您执行df.dropna(axis='index', how='all', inplace=False)时,它认为您不想更改原始的DataFrame,因此它会为您创建具有所需更改的新副本

但是,当您将inplace参数更改为True

然后等同于明确地说我不想新的副本 DataFrame的值,而是对给定的DataFrame

进行更改

这会强制Python解释器创建新的DataFrame

但是您也可以通过将结果重新分配给原始DataFrame来避免使用inplace参数

df = df.dropna(axis='index', how='all')

答案 8 :(得分:-1)

inplace=True的使用取决于您是否要对原始df进行更改。

df.drop_duplicates()

只会查看已删除的值,而不会更改df

df.drop_duplicates(inplace  = True)

将删除值并更改df。

希望这会有所帮助。:)

答案 9 :(得分:-1)

就我在大熊猫方面的经验而言,我想回答。

'inplace = True'参数代表数据帧必须使更改永久生效 例如。

    df.dropna(axis='index', how='all', inplace=True)

更改相同的数据框(因为这只大熊猫在索引中找到NaN条目并将其删除)。 如果我们尝试

    df.dropna(axis='index', how='all')

pandas显示了我们进行了更改的数据框,但不会修改原始数据框'df'。