包含python对象(如列表)的Deepcopy pandas数据帧

2024-09-27 00:22:49 发布

您现在位置:Python中文网/ 问答频道 /正文

需要帮助理解变量赋值,指针。。。在

以下是可复制的。在

import pandas as pd

df = pd.DataFrame({
    'listData': [
        ['c', 'f', 'd', 'a', 'e', 'b'], 
        [5, 2, 1, 4, 3]
    ]})

df['listDataSort'] = df['listData']

给出:

^{pr2}$

如果我只想对listDataSort列中的列表进行排序,我可以尝试:

df['listDataSort'].apply(lambda l: l.sort())
df

但是,这会对两列中的列表进行适当的排序。在

             listData        listDataSort
0  [a, b, c, d, e, f]  [a, b, c, d, e, f]
1     [1, 2, 3, 4, 5]     [1, 2, 3, 4, 5]

我可以改为:

df = pd.DataFrame({
    'listData': [
        ['c', 'f', 'd', 'a', 'e', 'b'], 
        [5, 2, 1, 4, 3]
    ]})

df['listDataSort'] = df['listData'].apply(sorted)

给予:

             listData        listDataSort
0  [c, f, d, a, e, b]  [a, b, c, d, e, f]
1     [5, 2, 1, 4, 3]     [1, 2, 3, 4, 5]

将df赋给另一个变量,比如df2仍然将所有内容改回原始源列表。此外,如何基于现有的数据帧创建新的数据帧,以便在不对现有数据帧进行相同更改的情况下对新数据帧进行更改?在

df = pd.DataFrame({
    'listData': [
        ['c', 'f', 'd', 'a', 'e', 'b'], 
        [5, 2, 1, 4, 3]
    ]})

df2 = df
print('\ndf\n', df)
print('\ndf2\n', df2)

df2['listDataSort'] = df2['listData']
print('\ndf\n', df)
print('\ndf2\n', df2)

df2['listDataSort'].apply(lambda l: l.sort())
print('\ndf\n', df)
print('\ndf2\n', df2)

印刷品:

df
             listData
0  [c, f, d, a, e, b]
1     [5, 2, 1, 4, 3]

df2
             listData
0  [c, f, d, a, e, b]
1     [5, 2, 1, 4, 3]

df
             listData        listDataSort
0  [c, f, d, a, e, b]  [c, f, d, a, e, b]
1     [5, 2, 1, 4, 3]     [5, 2, 1, 4, 3]

df2
             listData        listDataSort
0  [c, f, d, a, e, b]  [c, f, d, a, e, b]
1     [5, 2, 1, 4, 3]     [5, 2, 1, 4, 3]

df
             listData        listDataSort
0  [a, b, c, d, e, f]  [a, b, c, d, e, f]
1     [1, 2, 3, 4, 5]     [1, 2, 3, 4, 5]

df2
             listData        listDataSort
0  [a, b, c, d, e, f]  [a, b, c, d, e, f]
1     [1, 2, 3, 4, 5]     [1, 2, 3, 4, 5]

同时:

df = pd.DataFrame({
    'listData': [
        ['c', 'f', 'd', 'a', 'e', 'b'], 
        [5, 2, 1, 4, 3]
    ]})
print('\ndf\n', df)

df3 = df
df3['listDataSort'] = df3['listData'].apply(sorted)
print('\ndf\n', df)
print('\ndf3\n', df3)

印刷品:

df
             listData
0  [c, f, d, a, e, b]
1     [5, 2, 1, 4, 3]

df
             listData        listDataSort
0  [c, f, d, a, e, b]  [a, b, c, d, e, f]
1     [5, 2, 1, 4, 3]     [1, 2, 3, 4, 5]

df3
             listData        listDataSort
0  [c, f, d, a, e, b]  [a, b, c, d, e, f]
1     [5, 2, 1, 4, 3]     [1, 2, 3, 4, 5]

Tags: 数据lambdadataframedf列表排序pdapply
1条回答
网友
1楼 · 发布于 2024-09-27 00:22:49

当你跑的时候

df['listDataSort'] = df['listData']

您只需将列表的引用复制到新列中。这意味着只执行浅表复制,两列引用相同的列表。因此,对一列的任何更改都可能影响到另一列。在

您可以将列表理解与sorted一起使用,后者返回数据的副本。这对你来说应该是最简单的选择。在

^{pr2}$

现在,当涉及到复制整个数据帧的问题时,事情要复杂一些。我建议deepcopy

import copy
df2 = df.apply(copy.deepcopy)

相关问题 更多 >

    热门问题