파이썬 판다스 데이터프레임 정렬 방법 sort_values()

 

1. 데이터프레임에 대해 정렬하는 방법(특정 컬럼 기준으로)

2. 시리즈로 정렬하는 방법(하나의 열에 대해)

3. 내림차순으로 바꾸는 방법

4. 그리고 여러 컬럼을 리스트로 묶는 방법 

 


 

시작합니다.

라이브러리를 호출하고, 데이터프레임을 생성합니다.

import pandas as pd

df = pd.DataFrame([
    [16, 7, 10],
    [15, 8, 11],
    [14, 9, 12]],
    columns = ['a', 'b', 'c'],
    index = [1, 2, 3]
)
df

 

df

1. 컬럼 'a'를 기준으로 데이터프레임을 정렬해봅시다.

# 프레임의 정렬
df.sort_values('a')

결과가 데이터프레임으로 나타난다는 것이 보이시나요?

이 점이 중요합니다.

2. 컬럼 'a'를 기준으로 시리즈를 정렬해봅시다.

# 시리즈의 정렬
df['a'].sort_values()

결과창이 시리즈로 나타난다는게 보이시나요?

결국 df를 호출한 뒤 ('a')라는 인자에 대해 정렬을 원한다면 데이터프레임으로 나타나고,

df['a']자체를 호출한 뒤 정렬하면 시리즈로 나타난다는 점을 인지하셔야 됩니다.

 

 

3번째로는 정렬 차순의 설명입니다.

sort_values는 오름차순, 내림차순의 파라미터가 있습니다.

해당 파라미터는 ascending으로 지정되어 있는데 기본 디폴트 값은 True로 되어있습니다. 즉, 오름차순이라는 것이죠.

위의 예시에서 ascending = False로 지정하고 내림차순으로 살펴보겠습니다.

# 프레임의 정렬, 내림차순
df.sort_values('a', ascending=False)

컬럼 'a'의 결과가 14, 15, 16순이 아니라 그 반대인 것을 볼 수 있습니다.

 

4. 마지막으로는 여러 컬럼을 기준으로 정렬 순서를 정할 수 있다는 겁니다.

column 인자를 리스트로 반환하면 됩니다.

# 프레임의 정렬, 리스트로 반환
df.sort_values(['b','c'], ascending=False)

'b', 'c' 컬럼에 대해서 내림차순으로 정렬된게 보이시나요?

 

이렇게 4가지를 살펴보았습니다.

1. 데이터프레임에 대해 정렬하는 방법(특정 컬럼 기준으로)

2. 시리즈로 정렬하는 방법(하나의 열에 대해)

3. 내림차순으로 바꾸는 방법

4. 그리고 여러 컬럼을 리스트로 묶는 방법 

파이썬 판다스 데이터프레임 합치기, pd.concat(), 열 합치기, 행 합치기, python pandas library cheet sheet

 

 

데이터 프레임을 생성했는데 행으로 합치는 법과 열로 합치는 법을 살펴보겠습니다.

우선 데이터프레임을 하나 만들어보죠.

column = ['이름', '나이', '사는곳']

# df1 데이터프레임 생성
df1 = pd.DataFrame([
    ['김길동', 18, '서울'],
    ['안홍조', 28, '경기'],
    ['강국지', 30, '부산']
], columns=column)

# df2 데이터프레임 생성
df2 = pd.DataFrame([
    ['홍연', 21, '강원'],
    ['이박사', 44, '경기'],
    ['공석사', 34, '충북']
], columns=column)

df1, df2

이 데이터프레임들을 하나의 데이터프레임으로 합쳐보겠습니다.

위아래로 붙여야 말이 되겠죠? 양옆으로 붙이면 이상한 데이터프레임이 되겠죠?

df3 = pd.concat([df1, df2])
df3.head()

 

concat 결과

그러나 무언가 이상합니다. 발견했나요?

행 인덱스가 중복되지요.

이렇게 되면 나중에 참조할때 상당한 문제가 생깁니다. 

2가지 방법이 있습니다. 

가장 간단한 방법은 pd.concat()의 파라미터로 ignore_index = True를 설정해주는 겁니다.

df3 = pd.concat([df1, df2], ignore_index=True)
df3.head()

 

다른 방법으로는 인덱스를 리셋해줘야 합니다.

df3.reset_index()

reset_index()의 특성상 기존의 인덱스는 feature로 생성되고 새로운 인덱스가 sort되서 할당이 됩니다.

그러나 이대로 두면 기존 데이터프레임에 적용되지 않습니다.

inplace = True 파라미터를 반환하거나, 새롭게 df3에 할당시켜줘야 합니다.

df3 = df3.reset_index()
# df3 = df3.reset_index().copy() 를 권장합니다.
# 혹은 df3.reset_index(inplace=True)

# df3.drop('index', axis=1, inplace=True)

# 인덱스를 또 드랍하는것이 번거로우니, 
df3.reset_index(drop=True)
#를 추천드립니다.

df3의 최종 결과물

간단한 방법과, 조금 복잡한 방법으로 나눠서 인덱스 설정을 살펴봤습니다.

결국 우리가 원하던대로 기존의 열에 새로운 행 데이터셋을 합치는 결과물이 완성되었습니다.

 

자 그러면, 반대의 경우도 생각해봐야겠죠? 동일한 열에서의 추가를 봤으니 그 다음은?

고정된 행에서, 오른쪽으로 붙여나가는 열의 데이터(피처 데이터)를 추가하는 겁니다.

기존의 데이터셋 df1을 다시 생성해보죠.

df1 = pd.DataFrame([
    ['김길동', 18, '서울'],
    ['안홍조', 28, '경기'],
    ['강국지', 30, '부산']
])

자 이제 3명의 가상인물의 추가적인 정보를 만든 데이터프레임과 합쳐보겠습니다.

이는 df2로 생성합니다.

df2_column = ['직업', '종교', '특이사항']
df2 = pd.DataFrame([
    ['의적', '불교', '홍길동아님'],
    ['피부과의사', '천주교', '얼굴홍조없음'],
    ['요리사', '기독교', '']
], columns=df2_column)

df2

자 이제 df1과 df2를 합쳐보겠습니다. axis=0(행)이 아닌, axis=1(열)끼리 붙여야겠죠?

df3 = pd.concat([df1, df2], axis=1)

df3

오늘의 코드는 여기까지입니다.

 

위의 개인정보는 임의로 정한 가상의 인물이며 특정인을 지칭하지 않는다는 점 알립니다.

감사합니다.

+ Recent posts