python - 当我打乱一个 DataFrame 的副本时,为什么原始 DataFrame 也打乱了?

标签 python numpy pandas random

<分区>

这里是输入,

    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)

最佳答案

是的,您的发现与我测试的结果一致。

我在网上找到这个 https://github.com/pydata/pandas/issues/4202

好像在pandas中,date frame copy会排除index(df.index不会被deep copy)

我尝试了以下可能的修复方法:

df1= pd.DataFrame(np.random.randn(10,3), columns= list("ABC") )
print df1.index
df2=df1.copy(deep= True)
df2.index = copy.deepcopy(df1.index)
np.random.shuffle(df2.index.values)
print df1.index

结果如下:

Int64Index([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype='int64')
Int64Index([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype='int64')

希望对您有所帮助。

关于python - 当我打乱一个 DataFrame 的副本时,为什么原始 DataFrame 也打乱了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34586213/

相关文章:

python - Unittest 和 doctest,如何使我的文件可调用?

python - 按 Pandas 分组并按值替换空值

python - 将 pandas/matplotlib 图像直接写入 XLSX 文件

python - pd.Series.cat.as_ordered() 在 Pandas 中做什么?

python - 向视频添加文本,Opencv

python - 尝试从 Python BS 中的网站抓取表格时出现 AttributeError

python - 在 python 中绘制盒子

python - numpy - 张量乘积

python - 在 Pandas 中创建新列的 np.where() 问题(可能是 NaN 问题?)

arrays - Numpy 迭代和追加