这已在前面讨论过,但答案相互矛盾:
> in-place is good!
> in-place is bad!
我想知道的是:
>为什么inplace = False是默认行为?
>什么时候改变它好? (好吧,我被允许改变它,所以我想这是有原因的).
>这是安全问题吗?也就是说,由于inplace = True,操作是否会失败/行为异常?
>我是否可以提前知道某个地点=真正的操作是否“真正”就地进行?
我到目前为止:
>许多Pandas操作都有一个inplace参数,总是默认为False,这意味着原始的DataFrame不受影响,并且操作返回一个新的DF.
>当设置inplace = True时,操作可能对原始DF有效,但它可能仍然在幕后复制,只需在完成后重新分配参考.
inplace的优点=错误:
>允许链接/功能语法:df.dropna().rename().sum()…这很好,并提供了懒惰评估或更有效的重新排序的机会(虽然我不认为Pandas是这样做).
>在可能是底层DF的切片/视图的对象上使用inplace = True时,Pandas必须执行SettingWithcopy检查,这是很昂贵的. inplace = False避免这种情况.
>一致&幕后可预测的行为.
inplace的优点=真:
>可以更快,更少内存占用(第一个链接显示reset_index()运行速度快两倍,并使用峰值内存的一半!).
因此,将copy-vs-view问题放在一边,除非专门编写链式语句,否则总是使用inplace = True似乎更有效.但这不是默认的熊猫选择,所以我错过了什么?
解决方法:
如果inplace是默认值,那么DataFrame将针对当前引用它的所有名称进行变异.
df = pd.DataFrame({'a': [3, 2, 1], 'b': ['x', 'y', 'z']})
现在,DataFrame保留行顺序非常重要 – 假设它来自数据源,其中插入顺序是关键的.
但是,我现在需要做一些需要不同排序顺序的操作:
def f(frame):
df = frame.sort_values('a')
# if we did frame.sort_values('a', inplace=True) here without
# making it explicit - our caller is going to wonder what happened
# do something
return df
那很好 – 我原来的df保持不变.但是,如果inplace = True是默认值,那么我的原始df现在将被排序为f()的副作用,我必须相信调用者要记住不要做某些我不希望的事情故意做某事……所以最好能够改变现有物体的任何事情明确地做到这一点,至少使事情变得更加明显以及为什么.
即使使用基本的Python内置可变项,您也可以观察到:
data = [3, 2, 1]
def f(lst):
lst.sort()
# I meant lst = sorted(lst)
for item in lst:
print(item)
f(data)
for item in data:
print(item)
# huh!? What happened to my data - why's it not 3, 2, 1?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。