Pandalar veri çerçevesinde rastgele satır seçimi


159

Pandalar'da bir DataFrame'den rastgele satır seçmenin bir yolu var mı?

Araba paketini kullanan R'de, some(x, n)başa benzer, ancak bu örnekte, x'den rastgele 10 satır seçen kullanışlı bir işlev vardır.

Ayrıca dilimleme belgelerine baktım ve eşdeğer bir şey yok gibi görünüyor.

Güncelleme

Şimdi sürüm 20 kullanılıyor. Örnek bir yöntem var.

df.sample(n)


1
Boyutun orijinalden daha büyük olduğu yerleri örneklemek istiyorsanız kullanın df.sample(N, replace=True). Daha fazla ayrıntı burada .
cs95

Yanıtlar:


57

Böyle bir şey mi?

import random

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

Not: Pandas v0.20.0 itibarıyla etiket bazlı endeksleme lehine ix kullanımdan kaldırılmıştırloc .


8
Teşekkürler @eumiro. Ben de işe df.ix[np.random.random_integers(0, len(df), 10)]yarayacağını düşündüm .
John

7
Numpy kullanmak istiyorsanız, bunu da yapabilirsiniz df.ix[np.random.choice(df.index, 10)].
naught101

7
Başka bir gönderideki biri np.random.choicebunun iki kat daha hızlı olduğunu belirttirandom.sample
gönderideki

5
Np.random.choice kullanırsanız replace = False belirtmeniz gerekir, aksi takdirde yinelenen satırlar alırsınız!
stmax

2
Bence ".ix" kullanımdan kaldırıldı ve etiket tabanlı indeksleme için .loc kullanmalısınız
compguy24

266

Panda sürümü 0.16.1ve üstü ile artık DataFrame.sample yerleşik bir yöntem var :

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)

Yukarıdaki yaklaşımlardan herhangi biri için, satırların geri kalanını aşağıdakileri yaparak elde edebilirsiniz:

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

df_0.7geçerli bir ad değil. Üstelik ben değiştirmenizi öneririz df_rest = df.loc[~df.index.isin(df_0_7.index)]ile df_rest = df.loc[df.index.difference(df_0_7.index)].
Pietro Battiston

@PietroBattiston Teşekkürler. Cevabı daha açık hale getirmeye çalışıyordum, ancak işe yaramayan bir örneğin açık olmadığını kabul ediyorum. Fark ucu ile güzel. Yine de, dilimlemeyi "örneğimin dizininde değil" olarak indeksler olarak okumayı tercih ediyorum. Performans artışı var difference()mı?
ryanjdillon

1
@ ryanjdillon kalan bir yazım hatası vardı, ben düzelttim. Yönteme gelince, aslında önerimi geri alıyorum, çünkü aslında biraz daha az verimli. df_percent.index.get_indexer(df.index) == -1yerine çok daha verimli (ama aynı zamanda daha çirkin) ...
Pietro Battiston

18

sample

V0.20.0 itibarıyla, pd.DataFrame.samplesabit sayı satırlarının rasgele bir örneğini veya satır yüzdesini döndürmek için kullanılabilen şunları kullanabilirsiniz :

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

Tekrarlanabilirlik için, random_statekullanmaya eşdeğer bir tam sayı belirtebilirsiniz np.ramdom.seed. Örneğin, ayarlamak yerine np.random.seed = 0şunları yapabilirsiniz:

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

7

Bunu yapmanın en iyi yolu rastgele modülün örnek fonksiyonudur.

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

Aslında bu size çok sayıda np.random.random_integers(0, len(df), N)nerede tekrarlanan endeksler verecektir N.


3

Aşağıdaki satır, veri çerçevesi df'sindeki mevcut toplam satır numaralarından n sayıda satırı değiştirmeden rastgele seçecektir.

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.