假设df为数据的我的pandas数据框,并dfcopy它的副本,
data = [[1,['A1']],[3,['A2','A2','A1']], [1,['A2']]]
df = pd.DataFrame(data)
dfcopy = df.copy()
0 1
0 1 ['A1']
1 3 ['A2', 'A2', 'A1']
2 1 ['A2']
df的ID为1874789864000,dfcopy的ID为1874789865736。与预期不同。
现在,我想在位置dfcopy [1,1]处删除一个'A2',并用1减少dfcopy [1,0](第0列是第1列中列表的长度)
dfcopy.at[1,0]=dfcopy.at[1,0]-1
df =
0 1
0 1 ['A1']
1 3 ['A2', 'A2', 'A1']
2 1 ['A2']
dfcopy =
0 1
0 1 ['A1']
1 2 ['A2', 'A2', 'A1']
2 1 ['A2']
如我所料,仅dfcopy减少了第0列中的数量。
现在,我删除元素dfcopy [1,1]的“ A2”
dfcopy.at[1,1].remove('A2')
df =
0 1
0 1 ['A1']
1 3 [ 'A2', 'A1']
2 1 ['A2']
dfcopy =
0 1
0 1 ['A1']
1 2 [ 'A2', 'A1']
2 1 ['A2']
id仍然与以前相同(未显示),但是现在我的df在位置df [1,1]上更改了
为什么在定义副本时会发生这种情况,我该如何解决?
intended output:
df =
0 1
0 1 ['A1']
1 3 [ 'A2', 'A2', 'A1']
2 1 ['A2']
dfcopy =
0 1
0 1 ['A1']
1 2 [ 'A2', 'A1']
2 1 ['A2']
我在纪录片和Stackoverflow上看了很多东西,但不明白为什么会这样。
解决方法
data = [[1,['A1']],[3,['A2','A2','A1']], [1,['A2']]]
df = pd.DataFrame(data)
dfcopy = df.copy()
dfcopy.at[1,0]=dfcopy.at[1,0]-1
list = list(dfcopy.at[1,1])
list.remove('A2')
dfcopy.at[1,1] = list
df =
0 1
0 1 ['A1']
1 3 [ 'A2', 'A2', 'A1']
2 1 ['A2']
dfcopy =
0 1
0 1 ['A1']
1 2 [ 'A2', 'A1']
2 1 ['A2']
最佳答案
import copy
df=copy.deepcopy(df)
可能为您工作!
如评论中所述,
。复制()
具有默认属性
深=真
,但它并不像您希望的那样深