프로그래밍 언어/Python

DataFrame 행 순서를 섞는 방법

Rateye 2021. 7. 29. 09:54
728x90
반응형
질문 : DataFrame 행 셔플

다음 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이있는 행 등이 뒤 따릅니다.

Type 이 혼합되도록 DataFrame의 행 순서를 섞고 싶습니다. 가능한 결과는 다음과 같습니다.

    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
...

이것을 어떻게 할 수 있습니까?

답변

Pandas로이를 수행하는 관용적 인 방법은 .sample 메서드를 사용하여 교체없이 모든 행을 샘플링하는 것입니다.

df.sample(frac=1)

frac 키워드 인수는 임의 샘플에서 반환 할 행의 비율을 지정하므로 frac=1 은 모든 행을 임의 순서로 반환 함을 의미합니다.

참고 : 데이터 프레임을 제자리에서 섞고 인덱스를 재설정하려면 다음을 수행 할 수 있습니다.

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

여기서 drop=True 지정하면 .reset_index 가 이전 인덱스 항목을 포함하는 열을 만들지 못합니다.

후속 참고 사항 : 위의 작업이 제자리에 있는 것처럼 보이지는 않지만 python / pandas는 셔플 된 객체에 대해 다른 malloc을 수행하지 않을만큼 똑똑합니다. 즉, 목표물이 변경된 경우에도,이다 (여기서 I 평균하여 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)
출처 : https://stackoverflow.com/questions/29576430/shuffle-dataframe-rows
728x90
반응형