pandas链接和“inplace”参数的使用

ddhy6vgd  于 2023-06-20  发布在  其他
关注(0)|答案(2)|浏览(73)

对于python中的pandas DataFrames,多个成员方法都有一个inplace参数,据称它允许你不创建对象的副本,而是直接修改原始对象
[*编辑补充: 然而,事实证明并非如@ juanpa. arrivillaga所指出的那样。inplace=True确实复制数据,只更新与修改对象关联的指针,因此与手动重新分配原始对象名称相比,几乎没有什么优势。]
我在网上看到的使用inplace=True的示例不包括使用链接的示例。相关SO线程中的这条评论可能是为什么我在任何地方都看不到这样的例子的答案:
你不能在适当的位置上操作in-place ops返回None并断开链
但是,如果你把一个inplace=True放在链的最后一个条目中,“就地链接”会起作用吗?[Edited to add: no]或者这相当于尝试更改在链中较早的链接中创建的副本,因为它不再是您的原始对象,在链语句完成后“丢失”?[
编辑后加上:* 是;参见答案here]
大数据对象的使用似乎排除了链接的概念,而不具备就地这样做的能力,至少在保持低存储器开销和高计算速度的期望范围内。是否有pandas的替代实现,例如一个等价的R的data.table在Python中可用,可能适合我的需要?或者,我唯一的选择是不链接(并快速计算),或者链接但创建数据的冗余副本,至少是暂时的?

7rfyedvj

7rfyedvj1#

我们试试看。

import pandas as pd
import numpy as np

df = pd.DataFrame({'value' : [2, 2, 1, 1, 3, 4, 5, np.NaN]})

df.sort_values('value').drop_duplicates().dropna(inplace=True)

预期:

value
2    1.0
0    2.0
4    3.0
5    4.0
6    5.0

结果:

value
0    2.0
1    2.0
2    1.0
3    1.0
4    3.0
5    4.0
6    5.0
7    NaN

答:否,链末端的inplace=True不会修改原始数据框架。

whlutmcx

whlutmcx2#

如果你真的想要它,你可以像这样创建一个 Package 器(未经测试):

class Wrap():
    def __init__(self, df):
        self.df = df
    
    def __getattr__(self, name):
        m = getattr(self.df, name)
        def f(*args, **kwargs):
            m(*args, **kwargs, inplace=True)
            return self
        
        return f

# Usage:

Wrap(df).func1(*params1).func2(*params2)

相关问题