理解 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
在何时修改的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()
返回None
并sorted(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 将具有减值后的值。
随着计算链的增长以及数据帧的副本有自己的生命周期,跟踪差异非常重要。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理必备:盘点2024年13款好用的项目管理软件