熊猫数据框中的随机行选择


159

有没有一种方法可以从Pandas的DataFrame中选择随机行。

在R中,使用汽车包装,有一个有用的功能some(x, n),它类似于head,但在此示例中,从x中随机选择10行。

我也看过切片文档,似乎没有什么等效的。

更新资料

现在使用版本20。有一个示例方法。

df.sample(n)


1
如果您要在尺寸大于原始尺寸的地方采样,请使用df.sample(N, replace=True)。更多细节在这里
cs95

Answers:


57

像这样吗

import random

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

注:由于熊猫v0.20.0的,ix 已被弃用,赞成loc基于标签索引。


8
谢谢@eumiro。我也得出结论df.ix[np.random.random_integers(0, len(df), 10)],也可以。
约翰,

7
如果您想使用numpy,那么您也可以这样做df.ix[np.random.choice(df.index, 10)]
naught101'2014-2-17

7
其他帖子中提到的np.random.choice速度是random.sample
Phani

5
如果使用np.random.choice,则必须指定replace = False,否则将得到重复的行!
stmax 2015年

2
我认为“ .ix”已被弃用,您应该使用.loc进行基于标签的索引
编制-compguy24

266

随着pandas版本0.16.1及更高版本,现在DataFrame.sample 内置了一个方法

import pandas

df = pandas.DataFrame(pandas.np.random.random(100))

# Randomly sample 70% of your dataframe
df_percent = df.sample(frac=0.7)

# Randomly sample 7 elements from your dataframe
df_elements = df.sample(n=7)

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

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

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)]
Pietro Battiston '18年

@PietroBattiston谢谢。我试图使答案更清晰,但我同意尚无明确的例子。尼斯与差异的提示。虽然,我仍然更喜欢写切片,以便我将其作为索引“不包含在样本的索引中”读取。可以提高性能difference()吗?
ryanjdillon

1
@ryanjdillon还有一个拼写错误,我已解决。关于该方法,我实际上是在撤回我的建议,因为实际上效率较低。df_percent.index.get_indexer(df.index) == -1相反,它的效率要高得多(但也更难看)……
Pietro Battiston,

18

sample

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

df = df.sample(n=k)     # k rows
df = df.sample(frac=k)  # int(len(df.index) * k) rows

为了重现性,您可以指定一个整数random_state,等效于使用np.ramdom.seed。因此,不用设置,例如np.random.seed = 0,您可以:

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

7

最好的方法是使用随机模块中的样本函数,

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]

4

实际上,这将为您提供重复的索引np.random.random_integers(0, len(df), N),其中的索引N很大。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.