반응형
질문
다음과 같은 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)
반응형
댓글