假设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)


可能为您工作!

如评论中所述,


  。复制()


具有默认属性


  深=真


,但它并不像您希望的那样深

07-24 16:50