首页 > 解决方案 > 在 pandas 中复制时意外更改 df

问题描述

让 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”,并将 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']

正如我所料,第 0 列中的数量仅在 dfcopy 中减少。现在我删除元素 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']

标签: pythonpandasdataframecopy

解决方案


import copy
df=copy.deepcopy(df)

可能对你有用!

正如评论中提到的,

。复制()

有默认属性

深=真

,但它并不像你想要的那样深


推荐阅读