熊猫 - inplace = True 是否被认为有害或无害?

2024-05-15 20:51:26 发布

您现在位置:Python中文网/ 问答频道 /正文

这一点之前已经讨论过,但答案有矛盾:

我想知道的是:

  • 为什么inplace = False是默认行为?
  • 什么时候换好?(好吧,我可以改变它,所以我想这是有原因的)。
  • 这是安全问题吗?也就是说,一个操作是否会由于inplace = True而失败/行为不当?
  • 我是否可以提前知道某个inplace = True操作是否“真的”执行到位?

我的观点是:

  • 许多Pandas操作都有一个inplace参数,总是默认为False,这意味着原始数据帧未被触及,并且操作返回一个新的DF。
  • 当设置inplace = True时,操作可能对原始DF起作用,但仍可能在后台处理副本,完成后只需重新分配引用。

优点inplace = False

  • 允许链式/函数式语法:df.dropna().rename().sum()...,这很好,并且提供了一个延迟计算或更有效的重新排序的机会(尽管我不认为Pandas正在这样做)。
  • 当在一个可能是底层DF的切片/视图的对象上使用inplace = True时,Pandas必须进行SettingWithCopy检查,这是很昂贵的。inplace = False避免了这一点。
  • 一致且可预测的幕后行为。

优点inplace = True

  • 可以更快也可以更少地占用内存(第一个链接显示reset_index()运行速度是峰值内存的两倍,并且使用了一半的峰值内存!)。

因此,撇开copy vs view问题不谈,除非特别编写了一个链式语句,否则始终使用inplace = True似乎更有效率。但这不是熊猫默认的选择,所以我错过了什么?


Tags: 内存答案infalsetruepandasdfis
1条回答
网友
1楼 · 发布于 2024-05-15 20:51:26

如果inplace是默认值,那么数据帧将针对当前引用它的所有名称进行变异。

举个简单的例子,比如我有一个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?     

相关问题 更多 >