我曾经看到过关于copy()方法不适用于嵌套数据列的问题,因为修改副本上的某些内容也会改变原始的嵌套框架。然而,我所能找到的只是关于在this question上重命名一个嵌套的字段。
尽管如此,我并没有重命名任何东西,我只是改变了嵌套列的一个字段。所以只是想确认,如果这也改变了原来的框架,尽管副本已经完成。如果是这样的话,那么我如何才能创建一个复制的嵌套框架,而不影响嵌套列的原始框架?
例如,在这段代码中,我有一个带有一列字典的框架。每个字典只有一个字段是一个数组,预计它是所有的整数,但一些浮点数滑入,所以我想把它们都转换为整数,而不改变原来的数组。
但是,如果我在复制的框架上应用用户定义的函数,它也会影响原始框架
df=pd.DataFrame({'a':[{'field':[1,2,3.0]},{'field':[1,2,4.0]},{'field':[1,2,5.0]}]})
print('printing the original dataframe: \n', df['a'])
def integer_converter(x):
x['a']['field']=[int(i) for i in x['a']['field']]
df2=df.copy(deep=True)
df2.apply(integer_converter,axis=1)
print('printing df2 after function: \n',df2['a'])
print('printing the original dataframe again: \n',df['a'])
产出如下:
printing the original dataframe:
0 {'field': [1, 2, 3.0]}
1 {'field': [1, 2, 4.0]}
2 {'field': [1, 2, 5.0]}
Name: a, dtype: object
printing df2 after function:
0 {'field': [1, 2, 3]}
1 {'field': [1, 2, 4]}
2 {'field': [1, 2, 5]}
Name: a, dtype: object
printing the original dataframe again:
0 {'field': [1, 2, 3]}
1 {'field': [1, 2, 4]}
2 {'field': [1, 2, 5]}
Name: a, dtype: object
1条答案
按热度按时间h7appiyu1#
你的例子是复制一个包含python对象(dict)的对象。深度复制将复制数据,但不会递归地复制。更新嵌套数据对象将反映在深层副本中。
换句话说,do.copy(deep=True)将深度复制df的后端数据矩阵,但不会深度复制矩阵中的元素(在本例中为dict)。
如果你真的想保持嵌套状态,你可以通过在dict中添加copy(),在copy上编辑,然后返回编辑后的副本来改进你的函数。因此,您还需要使用df2 = df2.apply(lambda x:......,轴=1)
请通过以下方式参考官方示例:(滚动到底部)enter link description here