微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python – 熊猫 – 就位=真正被认为有害或无效?

这已在前面讨论过,但答案相互矛盾:

> 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:

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] 举报,一经查实,本站将立刻删除。

相关推荐