理解 pandas 中的 inplace=True

2024-11-29 08:42:00
admin
原创
3
摘要:问题描述:在pandas库中很多时候都有选项可以就地更改对象,例如使用以下语句...df.dropna(axis='index', how='all', inplace=True) 我很好奇返回了什么以及对象在inplace=True传递时和传递时是如何处理的inplace=False。所有操作都是self在...

问题描述:

pandas库中很多时候都有选项可以就地更改对象,例如使用以下语句...

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

我很好奇返回了什么以及对象在inplace=True传递时和传递时是如何处理的inplace=False

所有操作都是self在何时修改的inplace=True?什么时候inplace=False会立即创建一个新对象(例如new_df = self,然后new_df返回)?


如果您试图关闭某人应该使用inplace=True但尚未使用的问题,请考虑使用replace() 方法不适用于 Pandas DataFrame 的问题。


解决方案 1:

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

df.an_operation(inplace=True)

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

df = df.an_operation(inplace=False) 

解决方案 2:

在熊猫中,inplace = True 是否有害?

TLDR;是的,确实如此。

  • inplace与名称所暗示的相反,通常不会阻止创建副本,并且(几乎)不会带来任何性能优势

  • inplace不适用于方法链

  • inplace如果在 DataFrame 列上使用,可能会导致SettingWithCopyWarning操作无法进行,从而导致代码中出现难以调试的错误

上述痛点是初学者常见的陷阱,因此删除此选项将简化 API。


我不建议设置此参数,因为它没有什么用处。请参阅此 GitHub 问题,其中建议inplace在整个 api 范围内弃用该参数。

人们普遍误以为使用inplace=True会使代码更高效或更优化。实际上,使用绝对不会带来任何性能优势inplace=True。原地版本和非原地版本都会创建数据的副本,而原地版本会自动将副本分配回去。

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

在 DataFrame 列上调用函数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()

前者有利于更好的代码组织和可读性。


另一个支持性说法是,APIset_axis最近发生了变化,inplace默认值从 True 变为了 False。请参阅GH27600。开发人员干得好!

解决方案 3:

我的使用方式是

# 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

解决方案 4:

参数inplace

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

一般来说Pandas意味着:

1. Pandas 创建原始数据的副本

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

3 ....将结果赋给原始数据。

4. ...删除副本。

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

1.你的代码将更难调试(实际上SettingwithCopyWarning就是警告你这个可能出现的问题)

2.与方法链冲突

那么还有什么情况我们应该使用它吗?

当然是的。如果我们使用 pandas 或任何工具来处理大型数据集,我们很容易面临这样的情况,一些大数据会占用我们整个内存。为了避免这种不良影响,我们可以使用一些技术,如方法链:

(
    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参数,除非您不处理大量数据,并且意识到在仍然使用参数的情况下可能出现的问题。

解决方案 5:

将其保存到同一个变量中

data["column01"].where(data["column01"]< 5, inplace=True)

将其保存到单独的变量

data["column02"] = data["column01"].where(data["column1"]< 5)

但是,你总是可以覆盖变量

data["column01"] = data["column01"].where(data["column1"]< 5)

仅供参考:默认情况下inplace = False

解决方案 6:

当尝试使用函数更改 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}

解决方案 7:

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

因此,当您这样做时,df.dropna(axis='index', how='all', inplace=False)它会认为您不想更改原件DataFrame,因此它会为您创建一个包含所需更改的新副本。

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

那么这相当于明确地说我不想要新的副本,DataFrame而是对给定的进行更改DataFrame

这迫使 Python 解释器创建新的DataFrame

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

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

解决方案 8:

inplace=True取决于您是否要更改原始 df。

df.drop_duplicates()

只会查看删除的值,但不会对 df 进行任何更改

df.drop_duplicates(inplace  = True)

将删除值并对 df 进行更改。

希望这有帮助。:)

解决方案 9:

inplace=True使函数不纯。它会更改原始数据框并返回 None。在这种情况下,您打破了 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 的内置 sort 和 sorted 类似。lst.sort()返回Nonesorted(lst)返回一个新列表。

一般来说,除非有特殊原因,否则不要使用inplace=True。当你必须编写重新分配代码时df = df.sort_values(),请尝试将函数调用附加到 DSL 链中,例如

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

解决方案 10:

就我饲养熊猫的经验而言,我想回答一下。

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

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

更改相同的数据框(因为这个 pandas 在索引中发现 NaN 条目并删除它们)。如果我们尝试

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

pandas 显示我们所做更改的数据框,但不会修改原始数据框“df”。

解决方案 11:

如果您不使用 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 将具有减值后的值。

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

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   649  
  如何借鉴华为IPD体系优化企业研发?在当今竞争激烈的市场环境中,企业要想保持技术领先和产品竞争力,必须拥有一套高效且严谨的研发管理体系。华为作为全球领先的ICT解决方案提供商,其集成产品开发(IPD, Integrated Product Development)体系与质量管理体系(如ISO 9000系列)的融合实践,...
IPD项目管理   0  
  IPD流程图的7种经典绘制方法详解在产品开发领域,集成产品开发(Integrated Product Development,简称IPD)流程被广泛应用,以提高产品开发的效率和质量。IPD流程图作为这一流程的可视化工具,其绘制方法至关重要。本文将详细介绍七种经典的IPD流程图绘制方法,帮助项目管理人员和团队更好地理解和...
IPD研发管理体系   0  
  IPD流程:企业创新管理的核心引擎在当今快速变化的市场环境中,企业要想持续保持竞争力,就必须不断进行创新。而IPD(Integrated Product Development,集成产品开发)流程作为一种先进的产品开发管理模式,正逐渐成为众多企业提升创新能力、加速产品上市速度、降低开发成本的重要选择。本文将深入探讨IP...
IPD管理   0  
  IPD流程与传统产品开发流程的概述在产品开发领域,企业不断寻求高效、系统的管理方法以确保产品能够顺利从概念转化为市场成功的产品。集成产品开发(Integrated Product Development,简称IPD)流程与传统产品开发流程是两种截然不同的管理理念和方法。传统产品开发流程往往以职能部门为核心,各部门按顺序...
IPD流程中PDCP是什么意思   0  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用