example code
import pandas as pd
data = {'col1': [6, 9, 7, 4, 3, 9], 'col2': [1, 8, 1, 7, 3, 5],
'col3': [6, 4, 2, 3, 1, 9], 'col4': [2, 8, 2, 7, 1, 3]}
df = pd.DataFrame(data)
문제
예제의 데이터 프레임 df를 아래와 같은 데이터 프레임이 있을 때 가로로 값을 정렬하고 싶다면 어떻게 해야 할까?
(위 그림의 첫째 행을 보면 6, 1, 6, 2의 순서였지만 1, 2, 6, 6이 되었다)
해결
이 경우 pandas 라이브러리로도 가능하지만 numpy를 쓰는 것이 속도면에서 우월하다
numpy 함수 np.sort를 사용하자
import numpy as np
np.sort(df)
결과:
array([[1, 2, 6, 6],
[4, 8, 8, 9],
[1, 2, 2, 7],
[3, 4, 7, 7],
[1, 1, 3, 3],
[3, 5, 9, 9]], dtype=int64)
np.sort 함수로 가로로 정렬이 되었다.
다만 np.sort는 numpy 함수이기에 데이터 프레임이 아니라 넘파이 array를 반환한다
그 문제는 위 결과를 pd.DataFrame 함수로 데이터 프레임으로 만들어 주면 된다
out = pd.DataFrame(np.sort(df), index=df.index, columns=df.columns)
out:
완성이다
속도측정
np.sort 함수를 사용하는 이유는 속도 때문이다. 10000000 X 4의 랜덤한 데이터프레임을 만들어 시간측정을 해보자
import pandas as pd
import numpy as np
import time
# 10000000 X 4의 랜덤 데이터프레임 df 생성
df = pd.DataFrame(np.random.randint(1, 10, (10000000, 4)))
df = df.set_axis(df.columns + 1, axis=1).add_prefix('col')
# 가로로 정렬하고 시간 측정
start = time.time()
out = pd.DataFrame(np.sort(df), index=df.index, columns=df.columns)
end = time.time()
print(f"{end - start:.5f} sec")
결과:
0.42066 sec
천만행을 정렬해도 0.42초 밖에 걸리지 않는다. 그래서 매우 유용하다
유튜브에서 판다스 강의 중입니다
https://www.youtube.com/@KimPandas
'판다스 > 판다스 팁' 카테고리의 다른 글
matplotlib의 컬러맵에서 색상을 지정해 그래프를 그리는 방법 (0) | 2024.02.13 |
---|---|
pandas 에서 plotly 기반으로 그래프를 그리는 방법 (0) | 2023.12.22 |
[pandas] GitHub의 csv파일을 바로 데이터 프레임으로 불러오기 (0) | 2023.11.13 |
[pandas] read_csv 함수로 데이터 프레임 부를 때 파일의 encoding 방식 알아내기 (0) | 2023.11.11 |
[pandas] csv 파일에서 따옴표 안의 콤마(,)는 seperator로 적용하고 싶지 않을 때 (0) | 2023.09.05 |