有时候,我们需要打乱原有的数据顺序,让数据看起来像现实中比较混沌、自然的样子。这里推荐一个permutation操作,它来自numpy.random,可以随机生成一个序列:
In [134]: order = np.random.permutation(5) # 5个数 In [135]: order Out[135]: array([3, 4, 1, 2, 0])
然后我们用它处理下面的df,让行的顺序变成和order的一样:
In [136]: df = pd.DataFrame(np.arange(5 * 4).reshape((5, 4))) In [137]: df Out[137]: 0 1 2 3 0 0 1 2 3 1 4 5 6 7 2 8 9 10 11 3 12 13 14 15 4 16 17 18 19 In [138]: df.take(order) # Out[138]: 0 1 2 3 3 12 13 14 15 4 16 17 18 19 1 4 5 6 7 2 8 9 10 11 0 0 1 2 3 In [139]: df.iloc[order] # 同上 Out[139]: 0 1 2 3 3 12 13 14 15 4 16 17 18 19 1 4 5 6 7 2 8 9 10 11 0 0 1 2 3
可以看到,通过take函数,使用order作为参数,打乱了df的行顺序。
还有一种叫做抽样的操作,从原样本集合中抽取一部分形成新的样本集合,分重复抽样和不重复抽样。pandas提供的sample函数帮我们实现了这一功能:
In [140]: df.sample(n=3) Out[140]: 0 1 2 3 0 0 1 2 3 4 16 17 18 19 1 4 5 6 7 In [141]: df.sample(n=10) --------------------------------------------------------------------------- ValueError Traceback (most recent call last) In [142]: df.sample(n=10,replace=True) Out[142]: 0 1 2 3 3 12 13 14 15 2 8 9 10 11 2 8 9 10 11 0 0 1 2 3 3 12 13 14 15 0 0 1 2 3 2 8 9 10 11 4 16 17 18 19 1 4 5 6 7 3 12 13 14 15
很明显,取样的操作是针对每行的。前面我们说过,一行就是一条记录,一个样本。
取样操作也可以针对每列,因为sample函数有axis参数。
df.take(order)应该等价于df.loc[order]
take():调整顺序。sample():随机抽样。
纠正:take()实际上是抽取的意思。