这是输入,
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)
答案 0 :(得分:5)
是的,您的发现与我测试的结果一致。
我在网上发现了https://github.com/pydata/pandas/issues/4202
似乎在pandas中,日期框架副本将排除索引(df.index不会被深层复制)
我尝试过的可能修复方法如下:
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')
希望它有所帮助。
答案 1 :(得分:3)
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
并分配给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但其值不是,这仍然很奇怪。