我从DataFrame
文件加载.tsv
。我想生成一些探索性的情节。问题是数据集很大(约100万行),因此在图上有太多的点可以看到趋势。此外,还需要一段时间才能进行策划。
我想对10000个随机分布的行进行子采样。这应该是可重复的,因此每次运行都会产生相同的随机数序列。
这:Sample two pandas dataframes the same way似乎在正确的轨道上,但我无法保证子样本的大小。
答案 0 :(得分:17)
您可以使用np.random.choice
从索引中选择随机元素。例如,选择5个随机行:
df = pd.DataFrame(np.random.rand(10))
df.loc[np.random.choice(df.index, 5, replace=False)]
此功能是1.7中的新功能。如果你想要一个旧的numpy的解决方案,你可以洗牌数据并采取其中的第一个元素:
df.loc[np.random.permutation(df.index)[:5]]
通过这种方式,您不再对DataFrame进行排序,但如果plottin需要这样(例如,对于线图),您可以在之后执行.sort()
。
答案 1 :(得分:15)
不幸的是np.random.choice
对于小样本来说似乎很慢(少于所有行的10%),你可能最好使用普通的'样本:
from random import sample
df.loc[sample(df.index, 1000)]
对于大型DataFrame(一百万行),我们看到小样本:
In [11]: %timeit df.loc[sample(df.index, 10)]
1000 loops, best of 3: 1.19 ms per loop
In [12]: %timeit df.loc[np.random.choice(df.index, 10, replace=False)]
1 loops, best of 3: 1.36 s per loop
In [13]: %timeit df.loc[np.random.permutation(df.index)[:10]]
1 loops, best of 3: 1.38 s per loop
In [21]: %timeit df.loc[sample(df.index, 1000)]
10 loops, best of 3: 14.5 ms per loop
In [22]: %timeit df.loc[np.random.choice(df.index, 1000, replace=False)]
1 loops, best of 3: 1.28 s per loop
In [23]: %timeit df.loc[np.random.permutation(df.index)[:1000]]
1 loops, best of 3: 1.3 s per loop
但大约10%的情况大致相同:
In [31]: %timeit df.loc[sample(df.index, 100000)]
1 loops, best of 3: 1.63 s per loop
In [32]: %timeit df.loc[np.random.choice(df.index, 100000, replace=False)]
1 loops, best of 3: 1.36 s per loop
In [33]: %timeit df.loc[np.random.permutation(df.index)[:100000]]
1 loops, best of 3: 1.4 s per loop
如果你要对所有东西进行采样(不要使用样本!):
In [41]: %timeit df.loc[sample(df.index, 1000000)]
1 loops, best of 3: 10 s per loop
注意:numpy.random和random都接受种子,以重现随机生成的输出。
正如@joris在评论中指出的那样,选择(没有替换)实际上是sugar for permutation所以对于较小的样本而言,它是恒定的时间和较慢的时间并不令人惊讶......
答案 2 :(得分:5)
现在,可以在DataFrame上使用sample
方法:
>>> help(df.sample)
Help on method sample in module pandas.core.generic:
sample(self, n=None, frac=None, replace=False, weights=None, random_state=None, axis=None) method of pandas.core.frame.DataFrame instance
Returns a random sample of items from an axis of object.
可以使用random_state
关键字
>>> len(set(df.sample(n=1, random_state=np.random.RandomState(0)).iterations.values[0] for _ in xrange(1000)))
1
>>> len(set(df.sample(n=1).iterations.values[0] for _ in xrange(1000)))
40