<分区>
这里是输入,
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)