티스토리 뷰

728x90
반응형

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

 

pandas.DataFrame.sort_values — pandas 1.2.2 documentation

If True, the resulting axis will be labeled 0, 1, …, n - 1.

pandas.pydata.org

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)

 

 

728x90
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
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
글 보관함