DeepCopy在包含列表的数据框架上不起作用吗?如何解决

发布于 2025-02-11 00:49:18 字数 837 浏览 2 评论 0 原文

我正在尝试复制包含列表的数据框架。在复制的DF上,我必须对列表进行修改,但是原始列表也会被修改,这不是我想要的。我尝试过:

  • df.copy()
  • df.copy(deep = true)
  • copy.deepcopy(df)
  • df.apply(copy.deepcopy)

,但无效。据我了解,DeepCopy在包含可变对象的数据范围内不起作用。 这是我在网络上发现的示例代码:

>>> import copy
>>> import pandas as pd
>>> df = pd.DataFrame({'q': ['a', 'b', 'c'], 'w': [1, 2, [3, 4, 5]]})
>>> df
   q          w
0  a          1
1  b          2
2  c  [3, 4, 5]
>>> df_c = df.apply(copy.deepcopy)
>>> df_c
   q          w
0  a          1
1  b          2
2  c  [3, 4, 5]
>>> del df_c.loc[2, 'w'][0]
>>> df_c
   q       w
0  a       1
1  b       2
2  c  [4, 5]
>>> df
   q       w
0  a       1
1  b       2
2  c  [4, 5]

有没有办法对这种DF进行真正的深度拷贝?还是您将如何管理这种情况?

I am trying to copy a dataframe which contains lists. On the copied DF I have to apply modifications to the lists, however also the original lists get modified, which is not what I want. I have tried:

  • DF.copy()
  • DF.copy(deep=True)
  • copy.deepcopy(DF)
  • DF.apply(copy.deepcopy)

but none work. To my understanding, deepcopy does not work on dataframes containing mutable objects.
This is a sample code I found on the web:

>>> import copy
>>> import pandas as pd
>>> df = pd.DataFrame({'q': ['a', 'b', 'c'], 'w': [1, 2, [3, 4, 5]]})
>>> df
   q          w
0  a          1
1  b          2
2  c  [3, 4, 5]
>>> df_c = df.apply(copy.deepcopy)
>>> df_c
   q          w
0  a          1
1  b          2
2  c  [3, 4, 5]
>>> del df_c.loc[2, 'w'][0]
>>> df_c
   q       w
0  a       1
1  b       2
2  c  [4, 5]
>>> df
   q       w
0  a       1
1  b       2
2  c  [4, 5]

Is there a way to make a real deepcopy on this kind of DF? Or how would you manage this situation?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

柠栀 2025-02-18 00:49:18

如您所提到的,DeepCopy不会复制数据框中的列表。


“请注意,复制包含Python对象的对象时,深副本将复制数据,但不会递归地进行。更新嵌套的数据对象将反映在深层副本中。”

import pandas as pd
df = pd.DataFrame({'q': ['a', 'b', 'c'], 'w': [1, 2, [3, 4, 5]]})
>>> df
   q          w
0  a          1
1  b          2
2  c  [3, 4, 5]

# Use this method to avoid importing copy.
df_c = df.copy(deep=True)
# Make a new list to avoid the issue.
new_list = df_c.loc[2, 'w']
# Do what you need to with it.
df_c.loc[2, 'w'] = new_list[1:3]
>>> df_c
   q       w
0  a       1
1  b       2
2  c  [4, 5]
>>> df
   q          w
0  a          1
1  b          2
2  c  [3, 4, 5]

As you have mentioned, deepcopy does not copy the lists within your dataframe.

https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.copy.html
"Note that when copying an object containing Python objects, a deep copy will copy the data, but will not do so recursively. Updating a nested data object will be reflected in the deep copy."

import pandas as pd
df = pd.DataFrame({'q': ['a', 'b', 'c'], 'w': [1, 2, [3, 4, 5]]})
>>> df
   q          w
0  a          1
1  b          2
2  c  [3, 4, 5]

# Use this method to avoid importing copy.
df_c = df.copy(deep=True)
# Make a new list to avoid the issue.
new_list = df_c.loc[2, 'w']
# Do what you need to with it.
df_c.loc[2, 'w'] = new_list[1:3]
>>> df_c
   q       w
0  a       1
1  b       2
2  c  [4, 5]
>>> df
   q          w
0  a          1
1  b          2
2  c  [3, 4, 5]
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文