Python计时器功能对我在参数中的原始数据集生效



我对Python Decorator相对较新。

我有这个装饰函数。

def myTimer(func):
    def wrapper(*args, **kargs):
      t1 = time.time()
      result = func(*args, **kargs)
      t2 = time.time() - t1
      print('Execution Time (function : {}) : {} sec'.format(func.__name__, t2))
      return result
    return wrapper

这只是计时器函数。而且,我有一种基于另一列的列添加列的方法。

@myTimer
def createID(dat):
    dat['new'] = dat.apply(lambda x: '_'.join(map(str, x[4:8])), axis = 1)
    return dat

这生成了一个新列,其值只是" _"分隔符组合的另一个列值。

现在,如果我在上面定义了两个函数并在下面运行

tdat2 = createID(tdat)

,然后TDAT2正确返回,但更改也对TDAT(原始数据集)生效。我的意思是,TDAT首先有30列,TDAT2应该有31列,这很好,但是TDAT也有新列。

有什么办法可以解决此问题?我已经尝试过下面的尝试,这对我来说很好,但是由于代码约定等

@myTimer
def createID2(dat):
    result = dat.copy()
    result['new'] = result.apply(lambda x: '_'.join(map(str, x[4:8])), axis = 1)
    return result

预先感谢。

一些注释

  1. 由于您没有类,因此createID称为函数。这是一个黑匣子:它需要输入,做某事并返回输出。从python上,功能以小写字母写成,例如create_id
  2. my_timer()也是包装其装饰功能的功能,即 create_id()。您的装饰器确实对包装功能没有任何作用,除了打印某些内容(副作用)。

因此,装饰功能内部发生的任何事情都不会受到装饰器的影响。它只是时间到达函数调用的速度。


您要描述的突变问题是熊猫问题(请参阅查看与副本上的文档)。您已经用.copy()方法解决了它。

最新更新