Python 数据帧中的随机行选择

Python 数据帧中的随机行选择,python,pandas,random,Python,Pandas,Random,是否有一种方法可以从Pandas中的数据帧中选择随机行 在R中,使用car包,有一个有用的函数some(x,n),它类似于head,但在本例中,从x中随机选择10行 我还查看了切片文档,似乎没有任何等效的文档 更新 现在使用版本20。这里有一个示例方法 df.sample(n)类似的东西 import random def some(x, n): return x.ix[random.sample(x.index, n)] 注意:从Pandas v0.20.0开始,ix支持基于标签的

是否有一种方法可以从Pandas中的数据帧中选择随机行

在R中,使用car包,有一个有用的函数
some(x,n)
,它类似于head,但在本例中,从x中随机选择10行

我还查看了切片文档,似乎没有任何等效的文档

更新 现在使用版本20。这里有一个示例方法

df.sample(n)

类似的东西

import random

def some(x, n):
    return x.ix[random.sample(x.index, n)]

注意:从Pandas v0.20.0开始,
ix
支持基于标签的索引。

实际上,这将为您提供重复索引
np.random.random_整数(0,len(df),N)
其中
N
是一个大数字。

实现这一点的最佳方法是使用随机模块中的样本函数,

import numpy as np
import pandas as pd
from random import sample

# given data frame df

# create random index
rindex =  np.array(sample(xrange(len(df)), 10))

# get 10 random rows from df
dfr = df.ix[rindex]

在pandas版本
0.16.1
及更高版本中,现在有一个
数据帧。示例

对于上述任何一种方法,您都可以通过执行以下操作获得其余行:

df_rest = df.loc[~df.index.isin(df_percent.index)]

下一行将从数据帧df的现有总行号中随机选择n行,而不进行替换

df=df.take(np.random.permutation(len(df))[:n])

从v0.20.0开始,您可以使用,它可以用于返回固定数量行的随机样本或行的百分比:

df = df.sample(n=k)     # k rows
df = df.sample(frac=k)  # int(len(df.index) * k) rows
对于再现性,您可以指定一个整数
随机_状态
,相当于使用。因此,不必设置,例如,
np.random.seed=0
,您可以:

df = df.sample(n=k, random_state=0)

谢谢@eumiro。我还计算出
df.ix[np.random.random_integers(0,len(df),10)]
也可以工作。如果你想使用numpy,那么你也可以做
df.ix[np.random.choice(df.index,10)]
。另一篇帖子中有人提到,
np.random.choice
的速度是
random.sample
的两倍,如果使用np.random.choice,则必须指定replace=False,否则会得到重复的行!我认为“.ix”已被弃用,您应该使用.loc作为基于标签的索引
df_0.7
不是有效名称。此外,我建议将
df_rest=df.loc[~df.index.isin(df_0_7.index)]
替换为
df_rest=df.loc[df.index.difference(df_0_7.index)]
@pietrobattison谢谢。我试图让答案更清楚,但我同意一个不起作用的例子并不清楚。关于差异的提示很好。尽管如此,我仍然更喜欢编写切片,以便将其作为索引“而不是在我的样本的索引中”读取。
difference()
)是否会提高性能?@ryanjdillon还有一个打字错误,我修复了它。关于这个方法,我实际上收回了我的建议,因为它确实有点低效
df_percent.index.get_indexer(df.index)=-1更有效(但也更难看)…如果您希望在大小大于原始大小的地方采样,请使用
df.sample(N,replace=True)
。更多细节。
df = df.sample(n=k, random_state=0)