这一点之前已经讨论过,但答案相互矛盾:
我想知道的是:
inplace = False
是默认行为李>inplace = True
而失败/行为不当李>inplace = True
操作是否会“真正”执行到位李>inplace
参数,总是默认为False
,这意味着原始数据帧未被触及,并且该操作返回一个新的DF李>inplace = True
时,操作可能对原始DF起作用,但它可能仍对幕后的副本起作用,完成后只需重新分配引用即可李>reset_index()
的运行速度是峰值内存的两倍,占用了峰值内存的一半!)李>df.dropna().rename().sum()...
,这很好,并且提供了延迟计算或更有效的重新排序的机会(尽管我不认为Pandas正在这样做)李>inplace = True
时,Pandas必须执行SettingWithCopy
检查,这很昂贵inplace = False
避免了这种情况李>因此,抛开复制与视图的问题不谈,似乎总是使用inplace = True
更有效,除非专门编写链式语句。但这不是熊猫的默认选择,那么我错过了什么呢
如果
inplace
是默认值,那么数据帧将针对当前引用它的所有名称进行变异一个简单的例子,假设我有一个
df
:现在非常重要的是,DataFrame保留了行顺序——比如说,它来自一个数据源,其中插入顺序是关键
但是,我现在需要执行一些需要不同排序顺序的操作:
没关系-我原来的
df
保持不变。然而,如果inplace=True
是默认值,那么我原来的df
现在将被归类为f()
的副作用,在这个副作用中,我必须信任调用方记住不要在原地做我不期望的事,而不是故意在原地做某事。。。因此,最好是任何能够在适当位置变异对象的东西都能显式地变异,至少使发生的事情和原因更加明显即使使用基本Python内置可变项,您也可以观察到以下情况:
是的。不仅仅是有害的非常有害This GitHub issue建议在不久的将来在api范围内弃用
inplace
参数。简言之,inplace
参数的所有问题如下:inplace
与名称的含义相反,通常不会阻止创建副本,而且(几乎)从未提供任何性能优势inplace
不适用于方法链接inplace
在对数据帧列调用时可能导致可怕的SettingWithCopyWarning
,有时可能无法就地更新该列上面的痛点对于初学者来说都是常见的陷阱,因此删除此选项将大大简化API
我们将更深入地了解以上几点
性能
一个常见的误解是,使用
inplace=True
将导致更高效或优化的代码。一般来说,使用inplace=True
不会带来性能上的好处(但也有少数例外情况,这些例外情况主要是库中实现细节的结果,不应作为支持使用此参数的支柱)。方法的大多数就地和异地版本都会创建数据的副本,就地版本会自动将副本分配回。复制是不可避免的方法链接
inplace=True
也阻碍了方法链接。对比相对于
意外陷阱} :
要记住的最后一个警告是调用
inplace=True
可以触发^{这可能会导致意外行为
相关问题 更多 >
编程相关推荐