HOWTO · Pandas
Pandas에서 DataFrame 행을 무작위로 섞는 방법
pandas의 pandas.DataFrame.sample(), NumPy의 numpy.random.permutation(), 또는 scikit-learn의 sklearn.utils.shuffle()을 사용해 DataFrame의 모든 행을 무작위로 섞을 수 있습니다.
이 페이지의 내용
pandas DataFrame의 모든 행 순서를 무작위로 바꾸려면 sample(frac=1)을 호출합니다. frac 인수는 전체 행을 포함하는 표본을 요청하고, axis=0은 행을 선택합니다(기본값). 샘플링은 새 DataFrame을 반환하므로 원본 객체의 순서는 바뀌지 않습니다. 순서는 무작위이므로 호출할 때마다 결과가 달라질 수 있습니다. 기본 샘플링 동작에서는 원본의 모든 행이 한 번씩 포함되고 각 행의 열 값은 함께 유지됩니다. 인덱스를 재설정하지 않으면 반환된 행에 원래 인덱스 레이블이 남습니다. 사용자 지정 인덱스도 기본 정수 인덱스와 마찬가지로 유지됩니다.
pandas.DataFrame.sample()로 DataFrame의 모든 행 섞기
pandas.DataFrame.sample()은 DataFrame을 이미 pandas에서 사용하고 있을 때 가장 직접적인 방법입니다. 이 예제는 작은 표를 만들고 섞인 복사본을 출력합니다. random_state를 고정해 구체적인 순서 하나를 보여 줍니다. 호출할 때마다 새로운 순서를 얻으려면 이 인수를 생략하세요.
다음 예제를 실행합니다.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
import pandas as pd
df = pd.DataFrame({
"item": ["pear", "plum", "lime", "fig"],
"quantity": [4, 2, 5, 1],
})
shuffled = df.sample(frac=1, random_state=1)
print(shuffled)
이 예제의 출력:
item quantity
3 fig 1
2 lime 5
0 pear 4
1 plum 2
결과를 변수에 할당해도 원래 df는 기존 순서 그대로 사용할 수 있습니다. 행을 선택한다는 점을 분명히 하려면 axis=0을 직접 지정하세요. 생략해도 행을 선택하는 동작은 같습니다.
섞은 뒤 인덱스 재설정하기
섞인 결과에는 원본 행의 레이블이 유지되므로 인덱스가 순서대로 보이지 않을 수 있습니다. 이 레이블을 0, 1, 2, ...로 바꾸려면 샘플링 뒤에 reset_index(drop=True)를 연결합니다.
shuffled = df.sample(frac=1).reset_index(drop=True)
reset_index()는 일반적으로 이전 인덱스를 열로 보존합니다. drop=True를 설정하면 이전 레이블을 버립니다. 이후 코드에서 새 순차 인덱스가 필요하면 이 방법을 사용하세요. 원래 레이블이 레코드를 식별하고 계속 레코드에 연결되어야 한다면 drop=True를 생략하면 됩니다.
numpy.random.permutation()으로 행 섞기
NumPy를 사용해 행을 무작위 순서로 선택할 수도 있습니다. numpy.random.permutation()은 행 위치의 순서를 섞습니다. 이 위치를 df.iloc[...]에 전달하면 해당 위치의 행 전체를 선택할 수 있습니다. 예를 들어 핵심 표현식은 df.iloc[numpy.random.permutation(len(df))]입니다. 위치를 기준으로 선택하므로 DataFrame의 인덱스 레이블과 관계없이 작동합니다. 연산 결과는 생성된 순서대로 행을 반환하며, 호출할 때마다 순서가 달라질 수 있습니다. 새 순차 레이블이 유용한 경우에만 결과의 인덱스를 재설정하세요.
sklearn.utils.shuffle()로 행 섞기
프로젝트에서 이미 scikit-learn을 사용한다면 sklearn.utils.shuffle(df)는 각 행에서 열 값 간의 연결을 유지하면서 행을 섞어 반환합니다. pandas 샘플링의 대안이며 scikit-learn 패키지가 필요합니다. 패키지가 없다면 프로그램을 실행하는 환경에 설치하세요. pandas만 사용하는 작업 흐름에서는 df.sample(frac=1)을 사용하면 이 의존성을 추가하지 않아도 됩니다. 어느 방법이든 새로운 순서를 사용하려면 반환된 DataFrame을 보관하거나 df에 다시 할당하세요. 두 방법 모두 행 전체를 섞으며, 행 안의 값만 섞거나 표에서 일부 행만 선택하지는 않습니다.