我有一个类,其中有一个DataFrame类型属性。我希望能够使用内置函数对对象执行算术运算,同时保持原始对象不可变。不幸的是,这些操作似乎也在改变原始对象。这是一个例子:
import numpy as np
import pandas as pd
class Container:
def __init__(self):
self.data = pd.DataFrame()
def generate(self):
self.data = pd.DataFrame(np.random.randint(0,100,size=(100, 1)), columns=['A'])
return self
def __add__(self, other):
copy = self
new = Container()
new.data['A'] = copy.data.eval(f"A + {0}".format(other))
return new
one = Container().generate()
two = one + 1
print(one.data == two.data)
我认为问题是copy = self
行,但即使使用copy()方法,我也似乎无法保留原始对象。
如何在创建新对象时确保原始对象不会更改?
答案 0 :(得分:0)
令人惊讶的是,虽然copy = self
不是副本,但您的错误实际上与此无关。我认为你甚至不需要那里的副本。
您的错误是由于双重格式化字符串:
f"A + {0}".format(other)
f"A + {0}"
是一个f字符串。与format
不同,它将文本0
计算为Python表达式,并将结果对象的字符串表示替换为结果字符串,从而生成"A + 0"
。在format
上拨打copy.data.eval("A + 0")
没有做任何事情,因为没有格式占位符。你最终打电话了
sqoop import \
--connect jdbc:mysql://localhost/loudacre \
--username training \
--password training \
--target-dir /axl172930/loudacre/pset1 \
--split-by acct_num \
--query 'SELECT first_name,last_name,acct_num,city,state from accounts a
JOIN (SELECT account_id, count(device_id) as num_of_devices
FROM accountdevice group by account_id
HAVING count(device_id) = 1)d ON a.acct_num = d.account_id
WHERE $CONDITIONS'
而不是添加您想要添加的内容。
答案 1 :(得分:-2)
你有deepcopy
吗?
from copy import deepcopy
dupe=deepcopy(thing)
#now thing and dupe are two separate objects