티스토리 뷰
Data를 처리할 때, Index가 동일한데 다른 속성의 Data를 갖는 2개의 List가 있다고 해 봅시다.
이때 2개의 List를 1개의 DataFrame 형태로 취급할 수가 있습니다.(2개의 List가 Pair를 이루기 때문)
이때, List N개의 List를 특정 List를 기준으로 정렬하는 방법 입니다.
Pandas의 pandas.DataFrame.sort_values(by = "")를 내장함수로 구현했다고 볼 수 있습니다.
pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.sort_values.html
Python의 내장함주 zip을 이용하면 두개 이상의 List를 Index끼리 묶어줍니다.
(ex. list1 = [1,2,3,4,5,6], list2 = [11,12,13,14,15,16] => list(zip(list1, list2)) = [[1,11], [2,12], [3,13], [4,14], [5,15], [6,16]])
이 상태에서, list 2로 정렬할 경우, list(zip(list1, list2))의 결과값의 모든 Element의 2번째 값을 비교하면 됩니다.
(이때 어떤 정렬알고리즘을 사용하던 문제가 없습니다.)
그러면, 각 Element의 2번째 값을 기준으로 정렬이 이뤄지고
list1은 자연스럽게 list2의 정렬의 order를 따라가게 됩니다:)
글보단 Python 코드로 보시면 보다 쉽게 이해될것이라고 생각합니다 ^_^
#bubble sort로 list를 정렬하며, 이때 list의 n번째 Index의 값을 기준으로 정렬
def bubble_sort(DT_list, n):
for i in range(len(DT_list)):
for j in range(len(DT_list)-i-1):
if DT_list[j][n] > DT_list[j+1][n]:
#Normal bubble Sort와 다르게 해당 값을 움직이는게 아니라
#해당 Element의 n번째Index의 값을 기준으로 판단 후
#해당 Element Set을 통째로 교환
temp = DT_list[j]
DT_list[j] = DT_list[j+1]
DT_list[j+1] = temp
return DT_list
import random
#Random한 25개의 값을 갖는 4개의 List를 듭니다.
test1 = [random.randint(0,1000) for i in range(25)]
test2 = [random.randint(0,1000) for i in range(25)]
test3 = [random.randint(0,1000) for i in range(25)]
test4 = [random.randint(0,1000) for i in range(25)]
#위 4개의 경우 0~24의 Index를 갖고, test1~test4 까지의 col을 갖는
#DataFrame과 동일한 형태라고 할 수 있습니다.
#Operation을 위해서 zip함수로 4개의 List를 묵어줍니다.
#묶어주면 ((test1[0],test2[0],test3[0],test4[0]),(test1[1],test2[1],test3[1],test4[1])...)
#의 형태가 되어 함수에서 정렬을 진행
result = bubble_sort(list(zip(test1, test2, test3, test4)),3)
print(result)
#[(a1,a2,a3,a4),...] 에서 a4(index = 3)을 기준으로 정렬된 결과
[(918, 98, 328, 30),
(131, 388, 1, 86),
(545, 846, 655, 118),
(61, 302, 526, 132),
(103, 605, 54, 209),
(822, 859, 398, 247),
(993, 168, 362, 260),
(959, 61, 963, 278),
(737, 106, 283, 279),
(293, 63, 510, 323),
(568, 829, 864, 348),
(432, 702, 365, 362),
(215, 581, 619, 415),
(409, 868, 48, 439),
(527, 749, 632, 502),
(999, 82, 142, 518),
(128, 329, 126, 535),
(380, 186, 747, 578),
(761, 8, 242, 587),
(577, 359, 549, 598),
(248, 386, 374, 698),
(887, 923, 496, 791),
(196, 94, 380, 906),
(692, 255, 199, 918),
(275, 984, 923, 999)]
#zip으로 묶인 List를 Unpacking 하는 방법입니다.
#ziped_list(=result)에 *를 붙여주면 list가 없는 개별 tuple 형태로 나눠집니다.
#이제 이 tuple을 zip으로 다시 묶어주면 기존의 original list가
#특정 Index를 기준으로 정렬된 상태로 얻을 수가 있습니다.
result = zip(*(result))
list(result)
'Python 잡지식' 카테고리의 다른 글
Python의 매개변수 전달방식 (0) | 2021.03.13 |
---|---|
Event Listener의 정체 (0) | 2021.03.10 |
Python의 Thread1 (0) | 2021.03.09 |
Pandas Boolean Indexing을 사용해 특정 Col의 Value 바꾸기 (0) | 2021.02.26 |
여러개의 List를 기준으로 정렬하기 (0) | 2021.02.23 |
- Total
- Today
- Yesterday
- 자료구조
- AVX
- SIMD
- C++
- 코딩테스트
- git
- Search알고리즘
- 프로그래머스
- 동적계획법
- 병렬처리
- Greedy알고리즘
- heap
- 사칙연산
- 알고리즘
- Sort알고리즘
- hash
- 분할정복
- Python
- 완전탐색 알고리즘
- prime number
- 컴퓨터그래픽스
- 이분탐색
- stack
- GDC
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |