我对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
预先感谢。
一些注释
- 由于您没有类,因此
createID
称为函数。这是一个黑匣子:它需要输入,做某事并返回输出。从python上,功能以小写字母写成,例如create_id
。 -
my_timer()
也是包装其装饰功能的功能,即create_id()
。您的装饰器确实对包装功能没有任何作用,除了打印某些内容(副作用)。
因此,装饰功能内部发生的任何事情都不会受到装饰器的影响。它只是时间到达函数调用的速度。
您要描述的突变问题是熊猫问题(请参阅查看与副本上的文档)。您已经用.copy()
方法解决了它。