Python Pandas : sample (DataFrame 섞기, DataFrame에서 랜덤한 행 추출하기, DataFrame sample, DataFrame shuffle)
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부터 다시 매깁니다.
다만 행이 랜덤하게 추출되는 것은 동일합니다.