pd.Series的排列变更导致原地更改

时间:2018-10-17 01:47:32

标签: python pandas numpy

我知道np.random.permutationnp.random.shuffle之间的区别。

但是当我将np.random.permutation用于pd.Series时,会意外地导致序列就地更改,并且还会导致数据帧就地更改。

我知道如何以其他方式排列它,但是我想知道numpypandas的设计问题吗?

演示数据显示:

import pandas as pd
import numpy as np
t = pd.Series([1,2,3,4])
#np.random.permutation(t)
assert all(t == np.random.permutation(t))

它不会引发AssertionError。 它将输出一个改组后的数组。但是当您检查t时,它也会更改。

如果您使用np.arraylist,就可以了。

t = np.array([1,2,3,4])
np.random.permutation(t)
assert all(t == np.random.permutation(t))

它确实会提高AssertionError

2 个答案:

答案 0 :(得分:1)

那是bug in numpy。对于某些类似数组的对象,numpy.random.permutation就地改组其参数。根据文档字符串,应该返回输入的改组副本;它不应就地更改输入。

正如您在问题中指出的那样,可以通过传入实际的numpy数组来避免此问题。如果t是熊猫Series,则可以使用np.random.permutation(t.values)

答案 1 :(得分:0)

我添加了一个循环来检查assert函数,并使用.any()替换“ all”。

import numpy as np

for i in range(100):
    t = np.array([1, 2, 3, 4])
    assert (t != np.random.permutation(t)).any(), print('Assertion at', i)

输出显示断言是随机发生的。