随机和抽样

阅读: 4734     评论:4

有时候,我们需要打乱原有的数据顺序,让数据看起来像现实中比较混沌、自然的样子。这里推荐一个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
  • n=3:指定从原来数据中抽取3行
  • n=10:弹出异常,因为原数据不够10行
  • replace=True:可以重复抽取,这样10行可以,因为有重复

很明显,取样的操作是针对每行的。前面我们说过,一行就是一条记录,一个样本。


 检测和过滤 字符串操作 

评论总数: 4


点击登录后方可评论

取样操作也可以针对每列,因为sample函数有axis参数。



df.take(order)应该等价于df.loc[order]



take():调整顺序。sample():随机抽样。



纠正:take()实际上是抽取的意思。