본문 바로가기

Pandas

DataFrame - 범위 슬라이싱, set_index


import pandas as pd

# 범위 슬라이싱
exam_data = {'수학' : [90, 80, 70, 30],
             '영어' : [98, 89, 95, 22],
             '음악' : [85, 95, 100, 55],
             '체육' : [100, 90, 90, 77]}


df = pd.DataFrame(exam_data, index=['a', 'b', 'c', 'd'])

# 2행 간격으로 슬라이싱 하려면...
ret = df.iloc[::2]
print(ret)

# 역순으로 정렬하려면
ret = df.iloc[::-1]
print(ret)

 

 

일단위, 요일단위로 순차정렬 되어있다면 슬라이싱 간격을 활용할 수 있겠다. 전체를 역순으로 정렬하는 건 알겠는데, 특정 컬럼을 선택해서 정렬하는 방법은 없을까?

 

 

import pandas as pd

# 범위 슬라이싱
exam_data = {'이름' : ['서준', '우현', '인아', '영철'],
             '수학' : [90, 80, 70, 30],
             '영어' : [98, 89, 95, 22],
             '음악' : [85, 95, 100, 55],
             '체육' : [100, 90, 90, 77]}

df = pd.DataFrame(exam_data)

# '이름' 열을 인덱스로 지정한다
df.set_index('이름', inplace=True)
print(df)

 

set_index 함수로 특정 컬럼을 행 인덱스로 지정할 수 있다. 인덱스로 지정을 안하면 결과는 아래와 같다 

 

   이름  수학  영어   음악   체육
0  서준  90  98   85  100
1  우현  80  89   95   90
2  인아  70  95  100   90
3  영철  30  22   55   77

 

 

인덱스로 지정하면 결과는 아래와 같다 

 

    수학  영어   음악   체육
이름                  
서준  90  98   85  100
우현  80  89   95   90
인아  70  95  100   90
영철  30  22   55   77

 

 

'이름' 컬럼이 인덱스 컬럼이 되었다는 것을 알 수 있다. 데이터베이스나 csv로 불러올려서, 첫번째 컬럼을 이런 방식으로 행 인덱스 지정을 하면 되겠다. 대부분의 경우는 그렇게 되겠지.. 

 

# 특정 원소 선택하기
a = df.loc['서준', '음악']
print(a)
b = df.iloc[0, 2]
print(b)

# 2개 이상 선택하기, 시리즈로 리턴
c = df.loc['서준', ['음악', '체육']]
print(c)

d = df.iloc[0, [2,3]]
print(d)

e = df.loc['서준', '음악':'체육']
print(e)

f = df.iloc[0, 2:]
print(f)

셀 하나를 선택하면 값이 나오고, 2개 이상이 선택되면 시리즈 객체로 리턴한다. 행과 열을 나열해서 선택해도 되고, 범위로 선택할 수도 있다. 범위를 쓸때는 ":" 를 이용하면 된다. 

 

 


Where there is a will there is a way