Випадковий вибір рядків у фреймі даних Pandas


159

Чи є спосіб вибрати випадкові рядки з DataFrame в Pandas.

У R, використовуючи автомобільний пакет, є корисна функція, some(x, n)яка схожа на голову, але вибирає, у цьому прикладі, 10 рядків навмання з x.

Я також переглянув документацію нарізки і, здається, немає нічого еквівалентного.

Оновлення

Зараз використовується версія 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вдвічі швидшеrandom.sample
Фані

5
Якщо ви використовуєте np.random.choice, вам потрібно вказати заміна = Неправильно, інакше ви отримаєте повторювані рядки!
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)].
П'єтро Баттістон

@PietroBattiston Дякую Я намагався зробити відповідь зрозумілішою, але я згоден, що неробочий приклад не зрозумілий. Приємно з підказкою про різницю. Хоча я все ж вважаю за краще писати нарізку так, щоб читати її як індекси "не в індексі моєї вибірки". Чи є підвищення продуктивності difference()?
ryanjdillon

1
@ryanjdillon була помилка, що залишилася, я її виправив. Щодо методу, я фактично повертаю свою пропозицію, оскільки справді це трохи менш ефективно. df_percent.index.get_indexer(df.index) == -1Натомість набагато ефективніше натомість (але ще й потворніше) ...
П'єтро Баттістон

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велика кількість.


3

Нижній рядок буде випадковим чином вибирати n кількість рядків із загальної кількості існуючих номерів рядків із фрейму даних df без заміни.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.