Python/Python Pandas

Python Pandas : sample (DataFrame 섞기, DataFrame에서 랜덤한 행 추출하기, DataFrame sample, DataFrame shuffle)

CosmosProject 2023. 7. 26. 21:29
728x90
반응형

 

 

 

pandas의 sample method는 DataFrame에서 랜덤한 행을 추출해줍니다.

 

 

Syntax

DataFrame.sample(frac=float,
                 replace=True/False,
                 ignore_index=True/False)

 

- frac

이 옵션은 0~1 사이의 실수를 받습니다.

fraction의 약자로 원본 DataFrame의 존재하는 row의 개수 중 몇%를 추출할지를 결정합니다.

0.5는 원본 DataFrame에 존재하는 row의 개수가 10개라면 그의 50%인 5개만 추출합니다.

1은 원본 DataFrame에 존재하는 row의 개수가 10개라면 그의 100%인 10개를 추출합니다.

 

 

- replace

이 옵션은 행을 중복되게 추출하는걸 허용할지를 결정합니다.

replace = True -> 중복된 행도 추출하는 것을 허용.

replace = False -> 중복된 행 추출하는 것을 금지.

 

 

- ignore_index

이 옵션은 sample method의 결과로서 return되는 DataFrame의 index를 초기화할지 말지를 결정하는 인자입니다.

ignore_index = True -> 결과 DataFrame의 index 초기화

ignore_index = False -> 결과 DataFrame의 index를 원본 DataFrame의 index로 사용

 

 

 

 

import pandas as pd

dict_test = {
    'col1': [1, 1,
             2, 2, 2,
             3, 3, 3, 3, 3,
             4, 4, 4,
             5, 5, 5, 5],
    'col2': [1000, 2000,
             100, 300, 500,
             200, 300, 100, 150, 180,
             580, 200, 10,
             100, 80, 55, 10]
}

df_test = pd.DataFrame(dict_test)
print(df_test)


df_test_sample = df_test.sample(frac=1,
                         replace=False,
                         ignore_index=False)
print(df_test_sample)



-- Result
    col1  col2
0      1  1000
1      1  2000
2      2   100
3      2   300
4      2   500
5      3   200
6      3   300
7      3   100
8      3   150
9      3   180
10     4   580
11     4   200
12     4    10
13     5   100
14     5    80
15     5    55
16     5    10


    col1  col2
8      3   150
2      2   100
5      3   200
15     5    55
12     4    10
14     5    80
11     4   200
10     4   580
9      3   180
0      1  1000
7      3   100
4      2   500
6      3   300
3      2   300
13     5   100
16     5    10
1      1  2000

 

위 예시를 봅시다.

첫 번째 출력된 원본 DataFrame과 두 번째 출력된 DataFrame을 비교해보면 그 순서가 랜덤하게 뒤섞인 것을 알 수 있습니다.

 

 

 

 

df_test = df_test.sample(frac=1,
                         replace=False,
                         ignore_index=False)

 

- frac=1

frac 옵션이 1로 설정되었으므로 원본 DataFrame의 모든 행(100%)을 추출합니다.

그래서 원본 DataFrame(df_test)과 sample method로부터 return된 결과 DataFrame(df_test_sample)의 row 개수가 동일합니다.

 

- replace=False

replace 옵션이 False로 설정되었으므로 행을 중복되게 추출하지 않습니다.

sample DataFrame의 index를 보면 중복된 index가 없는 것을 알 수 있습니다.

 

- ignore_index=False

ignore_index 옵션이 False로 설정되었으므로 결과 DataFrame의 index는 원본 DataFrame의 index를 그대로 가져와서 사용합니다.

그래서 sample method의 결과 DataFrame을 보면 index가 순서대로 되어있지 않고 뒤죽박죽으로 섞여있는 것을 볼 수 있습니다.

 

 

 

 

이제 옵션을 살짝씩 바꿔봅시다.

 

 

import pandas as pd

dict_test = {
    'col1': [1, 1,
             2, 2, 2,
             3, 3, 3, 3, 3,
             4, 4, 4,
             5, 5, 5, 5],
    'col2': [1000, 2000,
             100, 300, 500,
             200, 300, 100, 150, 180,
             580, 200, 10,
             100, 80, 55, 10]
}

df_test = pd.DataFrame(dict_test)
print(df_test)


df_test_sample = df_test.sample(frac=0.4,
                                replace=False,
                                ignore_index=False)
print(df_test_sample)



-- Result
    col1  col2
0      1  1000
1      1  2000
2      2   100
3      2   300
4      2   500
5      3   200
6      3   300
7      3   100
8      3   150
9      3   180
10     4   580
11     4   200
12     4    10
13     5   100
14     5    80
15     5    55
16     5    10

    col1  col2
3      2   300
15     5    55
9      3   180
8      3   150
14     5    80
2      2   100
6      3   300

 

위 예시에서는 frac 옵션값을 0.4로 했습니다.

 

원본 행에는 17개의 행이 있고, 그의 40%는 6.8입니다.

반올림하면 7이므로 총 7개의 랜덤한 행이 추출되었습니다.

 

 

 

 

 

 

 

 

 

 

import pandas as pd

dict_test = {
    'col1': [1, 1,
             2, 2, 2,
             3, 3, 3, 3, 3,
             4, 4, 4,
             5, 5, 5, 5],
    'col2': [1000, 2000,
             100, 300, 500,
             200, 300, 100, 150, 180,
             580, 200, 10,
             100, 80, 55, 10]
}

df_test = pd.DataFrame(dict_test)
print(df_test)


df_test_sample = df_test.sample(frac=1,
                                replace=True,
                                ignore_index=False)
print(df_test_sample)



-- Result
    col1  col2
0      1  1000
1      1  2000
2      2   100
3      2   300
4      2   500
5      3   200
6      3   300
7      3   100
8      3   150
9      3   180
10     4   580
11     4   200
12     4    10
13     5   100
14     5    80
15     5    55
16     5    10

    col1  col2
6      3   300
7      3   100
2      2   100
13     5   100
9      3   180
5      3   200
10     4   580
1      1  2000
9      3   180
0      1  1000
5      3   200
4      2   500
8      3   150
8      3   150
7      3   100
5      3   200
0      1  1000

 

replace 옵션을 True로 설정한 예시입니다.

replace 옵션을 True로 설정할 경우 행이 중복되게 추출될 수 있습니다.

 

위 예시를 보시면 결과 행에서 index = 0인 행이 2개 존재하고,

index = 8인 행도 2개 존재합니다.

반면이 index = 6인 행은 1개 존재합니다.

 

replace는 이렇게 랜덤하게 중복된 행이 추출될 수도 있도록 하는 옵션입니다.

 

 

 

 

 

 

import pandas as pd

dict_test = {
    'col1': [1, 1,
             2, 2, 2,
             3, 3, 3, 3, 3,
             4, 4, 4,
             5, 5, 5, 5],
    'col2': [1000, 2000,
             100, 300, 500,
             200, 300, 100, 150, 180,
             580, 200, 10,
             100, 80, 55, 10]
}

df_test = pd.DataFrame(dict_test)
print(df_test)


df_test_sample = df_test.sample(frac=1,
                                replace=False,
                                ignore_index=True)
print(df_test_sample)



-- Result
    col1  col2
0      1  1000
1      1  2000
2      2   100
3      2   300
4      2   500
5      3   200
6      3   300
7      3   100
8      3   150
9      3   180
10     4   580
11     4   200
12     4    10
13     5   100
14     5    80
15     5    55
16     5    10

    col1  col2
0      5   100
1      3   180
2      4   580
3      5    80
4      5    55
5      3   150
6      3   100
7      2   500
8      4    10
9      3   200
10     2   100
11     1  2000
12     2   300
13     3   300
14     5    10
15     4   200
16     1  1000

 

ignore_index = True로 설정하면 위처럼 sample method의 결과로서 return되는 결과 DataFrame의 index를 모두 reset하고 0부터 다시 매깁니다.

다만 행이 랜덤하게 추출되는 것은 동일합니다.

 

 

 

 

 

 

728x90
반응형