2016-10-24 5 views
4

df가장 효율적인 방법은 무작위로

df = pd.DataFrame(np.ones((10, 10)) * 2, 
        list('abcdefghij'), list('ABCDEFGHIJ')) 
df 

enter image description here

어떻게 무작위로 ~이 값의 20 %를 무효로 할 수 있습니다 고려 dataframe의 값을 null로? 당신은 당신이 샘플링 할 부분이 null 값 (즉, 한 비율을 뺀 당신이 결과 프레임에서 원하는 null이 아닌 값의 비율이다 sample으로 stackunstack을 사용할 수 있습니다

enter image description here

답변

8

당신은 생성 numpy.random.choice를 사용할 수있는 mask :

import numpy as np 

mask = np.random.choice([True, False], size=df.shape, p=[.2,.8]) 

df.mask(mask) 

한 줄에서 :

df.mask(np.random.choice([True, False], size=df.shape, p=[.2,.8])) 

~ 770μs에서 timeit을 사용하여 속도 테스트 :

>>> python -m timeit -n 10000 
     -s "import pandas as pd;import numpy as np;df=pd.DataFrame(np.ones((10,10))*2)" 
     "df.mask(np.random.choice([True,False], size=df.shape, p=[.2,.8]))" 
10000 loops, best of 3: 770 usec per loop 
+2

나는 내 대답보다이 점이 좋습니다. 보다 일반적인 방법으로, 하드 코딩하는 대신'size = df.shape'를 사용하는 것이 좋습니다. – root

+0

감사합니다. 답변에 추가되었습니다. – ASGM

+0

나는 원래 아주 비슷한 것을 씹어 먹었다. 이것은 훨씬 더 우아한 답변입니다. 나는 루트의 제안을 한 걸음 더 나아가 더 좋게 만들지는 않을 것이다. 그러나 모든 것이 도움이된다. 'df.values.shape'를 사용하십시오. – piRSquared

4

).

df = df.stack().sample(frac=0.8).unstack() 

결과 출력 :

 A B C D E F G H I J 
a 2.0 2.0 2.0 2.0 2.0 NaN NaN 2.0 2.0 2.0 
b 2.0 NaN 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 
c 2.0 NaN NaN 2.0 2.0 2.0 NaN 2.0 2.0 2.0 
d 2.0 2.0 2.0 2.0 2.0 NaN 2.0 2.0 2.0 2.0 
e 2.0 2.0 2.0 2.0 2.0 NaN 2.0 NaN 2.0 NaN 
f 2.0 2.0 NaN NaN 2.0 NaN 2.0 2.0 2.0 2.0 
g 2.0 2.0 NaN 2.0 NaN 2.0 2.0 2.0 2.0 2.0 
h 2.0 2.0 2.0 2.0 2.0 2.0 2.0 NaN NaN 2.0 
i NaN 2.0 2.0 2.0 2.0 2.0 NaN 2.0 2.0 2.0 
j 2.0 2.0 2.0 2.0 NaN 2.0 2.0 2.0 2.0 2.0 

편집

: 샘플이 얼마나 작은에 따라

는 위의 방법은 당신이 행을 잃을 수/그들은 모두 NaN 될 경우 열. 이 원하는되지 않은 경우, 해결 방법은 마지막에 reindex를 추가하는 것입니다 :

df = df.stack().sample(frac=0.8).unstack().reindex(index=df.index, columns=df.columns) 
관련 문제