Pandas 데이터 프레임에서 임의의 행 선택


159

Pandas의 DataFrame에서 임의의 행을 선택하는 방법이 있습니까?

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)]

참고 : 팬더의 v0.20.0로, ix 사용되지 않습니다 찬성 loc레이블 기반 인덱싱합니다.


8
감사합니다 @eumiro. 나는 또한 그 일을 할 df.ix[np.random.random_integers(0, len(df), 10)]수 있다고 운동했다.
John

7
numpy를 사용하려면을 수행 할 수도 있습니다 df.ix[np.random.choice(df.index, 10)].
naught101

7
다른 게시물에 누군가 np.random.choice가 두 배 빠르다고 언급했습니다random.sample
Phani

5
np.random.choice를 사용하는 경우 replace = False를 지정해야합니다. 그렇지 않으면 중복 행이 나타납니다!
stmax

2
".ix"는 더 이상 사용되지 않으며 레이블 기반 인덱싱에 .loc을 사용해야합니다.
compguy24

266

팬더 버전 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

@PietroBattiston 감사합니다. 나는 대답을 더 명확하게하려고 시도했지만 작동하지 않는 예가 명확하지 않다는 데 동의합니다. 차이에 대한 팁이 좋습니다. 그래도 슬라이싱을 작성하여 "샘플 인덱스에없는"인덱스로 읽습니다. 의 성능이 향상 difference()됩니까?
ryanjdillon

1
@ ryanjdillon 남아있는 오타가 있었어요. 고쳤습니다. 이 방법에 관해서는, 실제로는 조금 덜 효율적이기 때문에 실제로 내 제안을 철회하고 있습니다. df_percent.index.get_indexer(df.index) == -1... 훨씬 더 대신 (뿐만 아니라 더 추한) 효율적입니다
피에트로 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을 위해 using과 동등한 정수를 지정할 수 있습니다 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

아래 줄은 데이터 프레임 df에서 기존의 총 행 수 중 n 개의 행 수를 임의로 선택합니다.

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.