Pilihan baris acak dalam bingkai data Pandas

159

Apakah ada cara untuk memilih baris acak dari DataFrame di Pandas.

Dalam R, menggunakan paket mobil, ada fungsi some(x, n)yang berguna yang mirip dengan kepala tetapi memilih, dalam contoh ini, 10 baris secara acak dari x.

Saya juga telah melihat dokumentasi slicing dan sepertinya tidak ada yang setara.

Memperbarui

Sekarang menggunakan versi 20. Ada metode sampel.

df.sample(n)

John
sumber
1
Jika Anda mencari sampel yang ukurannya lebih besar dari aslinya, gunakan df.sample(N, replace=True). Lebih detail di sini .
cs95

Jawaban:

57

Sesuatu seperti ini?

import random

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

Catatan: Pada Panda v0.20.0, ix telah usang dalam mendukung locuntuk mengindeks berdasarkan label.

eumiro
sumber
8
Terima kasih @ eumiro. Saya juga berhasil yang df.ix[np.random.random_integers(0, len(df), 10)]juga akan berhasil.
John
7
Jika Anda ingin menggunakan numpy, maka Anda juga bisa melakukannya df.ix[np.random.choice(df.index, 10)].
naught101
7
Seseorang dalam posting lain menyebutkan bahwa np.random.choicekecepatannya dua kali lebih cepatrandom.sample
Phani
5
Jika Anda menggunakan np.random.choice Anda harus menentukan ganti = Salah, jika tidak, Anda akan mendapatkan baris duplikat!
stmax
2
Saya pikir ".ix" sudah usang, dan Anda harus menggunakan .loc untuk pengindeksan berbasis label
compguy24
266

Dengan versi panda 0.16.1dan yang lebih tinggi, sekarang ada DataFrame.sample metode bawaan :

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)

Untuk kedua pendekatan di atas, Anda bisa mendapatkan sisa baris dengan melakukan:

df_rest = df.loc[~df.index.isin(df_percent.index)]
ryanjdillon
sumber
df_0.7bukan nama yang valid. Selain itu, saya sarankan mengganti df_rest = df.loc[~df.index.isin(df_0_7.index)]dengan df_rest = df.loc[df.index.difference(df_0_7.index)].
Pietro Battiston
@PietroBattiston Terima kasih. Saya mencoba membuat jawabannya lebih jelas, tetapi saya setuju contoh yang tidak berfungsi tidak jelas. Bagus dengan tip tentang perbedaan. Padahal, saya masih lebih suka menulis slicing sehingga saya membacanya sebagai indeks "tidak ada dalam indeks sampel saya". Apakah ada peningkatan kinerja difference()?
ryanjdillon
1
@ryanjdillon ada kesalahan ketik yang tersisa, saya memperbaikinya. Mengenai metode, saya benar-benar mengambil kembali saran saya, karena memang agak kurang efisien. df_percent.index.get_indexer(df.index) == -1jauh lebih efisien sebagai gantinya (tetapi juga lebih jelek) ...
Pietro Battiston
18

sample

Pada v0.20.0, Anda dapat menggunakan pd.DataFrame.sample, yang dapat digunakan untuk mengembalikan sampel acak dari baris nomor tetap, atau persentase baris:

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

Untuk reproduktifitas, Anda dapat menentukan bilangan bulat random_state, setara dengan menggunakan np.ramdom.seed. Jadi, alih-alih mengatur, misalnya np.random.seed = 0, Anda dapat:

df = df.sample(n=k, random_state=0)
jpp
sumber
7

Cara terbaik untuk melakukan ini adalah dengan fungsi sampel dari modul acak,

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]
rlmlr
sumber
4

Sebenarnya ini akan memberi Anda indeks berulang di np.random.random_integers(0, len(df), N)mana Nsejumlah besar.

rlmlr
sumber
3

Baris di bawah ini akan secara acak memilih n jumlah baris dari total jumlah baris yang ada dari kerangka data df tanpa penggantian.

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

Mojgan Mazouchi
sumber