본문 바로가기
Python/Python FAQ

Python 데이터프레임 행 섞기, Shuffle DataFrame rows

by 베타코드 2023. 7. 3.
반응형

질문


다음과 같은 DataFrame이 있습니다:

    Col1  Col2  Col3  Type
0      1     2     3     1
1      4     5     6     1
...
20     7     8     9     2
21    10    11    12     2
...
45    13    14    15     3
46    16    17    18     3
...

DataFrame은 CSV 파일에서 읽어옵니다. Type이 1인 모든 행은 맨 위에 있으며, 그 다음으로 Type이 2인 행이, 그리고 그 다음으로 Type이 3인 행이 등장합니다.

DataFrame의 행 순서를 섞어서 모든 Type이 섞인 결과를 얻고 싶습니다. 가능한 결과는 다음과 같을 수 있습니다:

    Col1  Col2  Col3  Type
0      7     8     9     2
1     13    14    15     3
...
20     1     2     3     1
21    10    11    12     2
...
45     4     5     6     1
46    16    17    18     3
...

이를 어떻게 구현할 수 있을까요?


답변


판다스를 사용하여 이를 수행하는 관용적인 방법은 데이터 프레임의 .sample 메서드를 사용하여 모든 행을 대체하지 않고 샘플링하는 것입니다:

df.sample(frac=1)

frac 키워드 인수는 무작위 샘플에서 반환할 행의 비율을 지정하므로 frac=1은 모든 행을 반환한다는 것을 의미합니다(무작위로 정렬됨).


참고: 데이터프레임을 인덱스를 재설정하면서 인덱스를 섞으려면 다음과 같이 할 수 있습니다.

df = df.sample(frac=1).reset_index(drop=True)

여기서 drop=True를 지정하면 .reset_index가 이전 인덱스 항목을 포함하는 열을 생성하지 않습니다.

추가 참고: 위의 작업이 실제로 in-place인 것처럼 보이지 않을 수 있지만, 파이썬/판다스는 섞인 객체에 대해 추가 메모리 할당을 수행하지 않습니다. 즉, 참조 객체가 변경되었더라도 (즉, id(df_old)id(df_new)와 동일하지 않음을 의미함) 기본 C 객체는 여전히 동일합니다. 이를 확인하기 위해 간단한 메모리 프로파일러를 실행할 수 있습니다:

$ python3 -m memory_profiler .\test.py
Filename: .\test.py

Line #    Mem usage    Increment   Line Contents
================================================
     5     68.5 MiB     68.5 MiB   @profile
     6                             def shuffle():
     7    847.8 MiB    779.3 MiB       df = pd.DataFrame(np.random.randn(100, 1000000))
     8    847.9 MiB      0.1 MiB       df = df.sample(frac=1).reset_index(drop=True)

반응형

댓글