Pandasデータフレームでのランダムな行選択


159

パンダのデータフレームからランダムな行を選択する方法はありますか?

Rでは、carパッケージを使用して、some(x, n)headと同様の便利な関数がありますが、この例では、xからランダムに10行を選択します。

私もスライスのドキュメントを見ましたが、同等のものは何もないようです。

更新

現在バージョン20を使用しています。サンプルメソッドがあります。

df.sample(n)


1
サイズが元のサイズよりも大きいサンプルを探す場合は、を使用してくださいdf.sample(N, replace=True)。詳細はこちら
cs95

回答:


57

このようなもの?

import random

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

注: Pandas 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

7
別の投稿の誰かnp.random.choiceが2倍の速さで言及しているrandom.sample
Phani

5
np.random.choiceを使用する場合は、replace = Falseを指定する必要があります。それ以外の場合は、行が重複します。
stmax

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、2018年

@PietroBattistonありがとう。私は答えをより明確にすることを試みていましたが、機能しない例が明確でないことに同意します。違いのヒントで素敵です。ただし、「サンプルのインデックスではなく」インデックスとして読み取るように、スライシングを書くことを好みます。でパフォーマンスの向上はありdifference()ますか?
ryanjdillon

1
@ryanjdillonにタイプミスが残っていたので修正しました。この方法については、実際には少し効率が悪いため、私は実際に私の提案を取り戻しています。df_percent.index.get_indexer(df.index) == -1代わりにはるかに効率的です(ただし、醜くなります)...
ピエトロバッティストン2018

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

これを行う最良の方法は、randomモジュールのサンプル関数を使用することです。

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


3

下の行は、データフレームdfからの既存の合計行番号からn個の行を置き換えずにランダムに選択します。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.