微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python – 当我随机播放DataFrame的副本时,为什么原始DataFrame也会被洗牌?

参见英文答案 > In pandas, can I deeply copy a DataFrame including its index and column?                                    2个
这是输入,

    df1= pd.DataFrame(np.random.randn(10,3), columns= list("ABC") )
              A         B         C
    0  0.468682 -0.136178  0.418900
    1 -0.362995 -0.111931  0.433537
    2 -1.194483 -0.844683 -1.022719
    3  0.531893 -1.032088 -1.683009
    4  2.113807 -0.450628  0.004971
    5  0.141548 -0.621090 -0.135580
    6  0.128670 -0.460494 -0.016550
    7 -0.099141 -0.010140 -0.066042
    8  1.317759 -1.522207 -0.234447
    9 -0.039051 -1.395751 -0.431717

然后我创建了它的副本.我假设我实际上克隆了对象而不只是创建一个新的链接.我希望将原始DataFrame的副本随机播放,同时保持原始DataFrame不受影响.

    df2=df1.copy(deep= True)

通过这样做,我洗了df2之后

    np.random.shuffle(df2.index.values)

然后我发现df2和df1都被洗牌了.

    df1.index
    Out[177]: Int64Index([7, 8, 0, 1, 3, 4, 6, 2, 5, 9], dtype='int64')

    df2.index
    Out[178]: Int64Index([7, 8, 0, 1, 3, 4, 6, 2, 5, 9], dtype='int64')

有人说这是由于Deep copy实际上并不深.然后我试着看看每个DataFrame的索引是否引用了不同的对象.
我试过了,

    print(id(df1.index))
    print(id(df2.index))
    df1.index is df2.index

我有,

    156017776
    156170112
    False

现在我更加困惑.如果它们是不同的对象,为什么我的解决方案失败了,如何实现我想要的?
这不是this post的重复,因为那时深拷贝不会创建新的索引对象,但现在副本确实有一个新的索引对象.但问题仍然存在.
(我使用的是pandas 0.17.0; numpy 1.10.1)

解决方法:

df1.index和df2.index的ID不同,但df1.index.values和df2.index.values具有相同的ID:

In [68]: id(df1.index), id(df2.index)
Out[68]: (140032214366920, 140032214391720)

In [69]: id(df1.index.values), id(df2.index.values)
Out[69]: (140032213182304, 140032213182304)

np.random.shuffle更改值inplace,因此您可以使用np.random.permutation并分配给df2.index结果:

In [73]: df2.index = np.random.permutation(df2.index)

In [74]: df1.index
Out[74]: Int64Index([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype='int64')

In [75]: df2.index
Out[75]: Int64Index([6, 2, 1, 8, 7, 0, 4, 5, 3, 9], dtype='int64')

但是仍然奇怪的是为什么df1.index和df2.index有不同的ID,但它们的值不是.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐