Python DataFrame 컬럼명 인덱스로 설정하기 set_index

set_index() 메서드를 사용해 DataFrame에 설정된 컬럼명(열)을 인덱스로 사용할 수 있습니다.

인덱스에 이름을 지정해두면 loc, at으로 요소를 선택하는 경우에 편리하게 사용할 수 있습니다.

예제를 실행해 보면서 set_index() 메서드 사용방법을 알아보겠습니다.

샘플 데이터를 준비하겠습니다.

import pandas as pd

df = pd.DataFrame({'name': ['Alice','Bob','Charlie','Dave','Ellen','Frank'],
                   'age': [24,42,18,68,24,30],
                   'state': ['NY','CA','CA','TX','CA','NY'],
                   'point': [64,24,70,70,88,57]}
                  )

print(df)
#       name  age state  point
# 0    Alice   24    NY     64
# 1      Bob   42    CA     24
# 2  Charlie   18    CA     70
# 3     Dave   68    TX     70
# 4    Ellen   24    CA     88
# 5    Frank   30    NY     57

 

set_index() 사용 방법

첫 번째 인수에는 인덱스로 사용할 키를 지정합니다.

DataFrame에 설정한 컬럼명을 지정해 index로 지정하도록 하겠습니다.

import pandas as pd

df = pd.DataFrame({'name': ['Alice','Bob','Charlie','Dave','Ellen','Frank'],
                   'age': [24,42,18,68,24,30],
                   'state': ['NY','CA','CA','TX','CA','NY'],
                   'point': [64,24,70,70,88,57]}
                  )

df_i = df.set_index('name')
print(df_i)

 

결과

         age state  point
name                     
Alice     24    NY     64
Bob       42    CA     92
Charlie   18    CA     70
Dave      68    TX     70
Ellen     24    CA     88
Frank     30    NY     57

 

숫자로 표시되던 인덱스는 없어지고 name이 인덱스로 지정되었습니다.

name 컬럼이 인덱스로 지정되면서 데이터 열에서는 삭제되었습니다.

인덱스로 지정한 컬럼을 DataFrame 열에 남겨놓고 싶은 경우에는 drop 설정을 False로 합니다.

import pandas as pd

df = pd.DataFrame({'name': ['Alice','Bob','Charlie','Dave','Ellen','Frank'],
                   'age': [24,42,18,68,24,30],
                   'state': ['NY','CA','CA','TX','CA','NY'],
                   'point': [64,24,70,70,88,57]}
                  )

df_i = df.set_index('name', drop=False)
print(df_i)

 

결과

            name  age state  point
name
Alice      Alice   24    NY     64
Bob          Bob   42    CA     92
Charlie  Charlie   18    CA     70
Dave        Dave   68    TX     70
Ellen      Ellen   24    CA     88
Frank      Frank   30    NY     57

 

name 컬러가 인덱스로 지정되었지만 DataFrame에는 값이 그대로 남아있습니다.

 

set_index() 여러개 설정

인덱스를 여러개 설정하는 방법을 알아보겠습니다.

첫 번째 인수인 인덱스를 지정할 때 리스트 형태로 값을 설정합니다.

import pandas as pd

df = pd.DataFrame({'name': ['Alice','Bob','Charlie','Dave','Ellen','Frank'],
                   'age': [24,42,18,68,24,30],
                   'state': ['NY','CA','CA','TX','CA','NY'],
                   'point': [64,24,70,70,88,57]}
                  )

df_m = df.set_index(['state', 'name'])
print(df_m)

 

결과

               age  point
state name
NY    Alice     24     64
CA    Bob       42     92
      Charlie   18     70
TX    Dave      68     70
CA    Ellen     24     88
NY    Frank     30     57

 

state와 name으로 인덱스를 지정했습니다.

state 컬럼에 중복된 인덱스는 생략됩니다.

하지만 완벽하게 중복된 인덱스가 제거되지 않았습니다.

sort_index()를 실행해 완벽하게 중복된 인덱스가 제거되도록 합니다.

import pandas as pd

df = pd.DataFrame({'name': ['Alice','Bob','Charlie','Dave','Ellen','Frank'],
                   'age': [24,42,18,68,24,30],
                   'state': ['NY','CA','CA','TX','CA','NY'],
                   'point': [64,24,70,70,88,57]}
                  )

df_m = df.set_index(['state', 'name'])
df_m.sort_index(inplace=True)
print(df_m)

 

결과

               age  point
state name
CA    Bob       42     92
      Charlie   18     70
      Ellen     24     88
NY    Alice     24     64
      Frank     30     57
TX    Dave      68     70

 

인덱스 추가하기

인덱스를 지정한 상태에서 다시 set_index()로 컬럼을 지정하면 기존 인덱스는 사라집니다.

인덱스가 설정된 상태에서 다른 인덱스를 추가하고 싶은 경우는 append를 True로 설정합니다.

import pandas as pd

df = pd.DataFrame({'name': ['Alice','Bob','Charlie','Dave','Ellen','Frank'],
                   'age': [24,42,18,68,24,30],
                   'state': ['NY','CA','CA','TX','CA','NY'],
                   'point': [64,24,70,70,88,57]}
                  )

# 인덱스를 name으로 설정
df_i = df.set_index('name')
print(df_i)
#          age state  point
# name
# Alice     24    NY     64
# Bob       42    CA     92
# Charlie   18    CA     70
# Dave      68    TX     70
# Ellen     24    CA     88
# Frank     30    NY     57

# 인덱스를 state로 설정
# 기존에 설정된 name 인덱스는 삭제됨
df_ii = df_i.set_index('state')
print(df_ii)
#        age  point
# state
# NY      24     64
# CA      42     92
# CA      18     70
# TX      68     70
# CA      24     88
# NY      30     57

# state를 인덱스로 추가
# 인덱스는 name과 state로 설정
df_mi = df_i.set_index('state', append=True)
print(df_mi)
#                age  point
# name    state
# Alice   NY      24     64
# Bob     CA      42     92
# Charlie CA      18     70
# Dave    TX      68     70
# Ellen   CA      24     88
# Frank   NY      30     57

 

추가한 인덱스와 기존에 있던 인덱스 순서를 변경하고 싶은 경우는 swaplevel()을 사용합니다.

import pandas as pd

df = pd.DataFrame({'name': ['Alice','Bob','Charlie','Dave','Ellen','Frank'],
                   'age': [24,42,18,68,24,30],
                   'state': ['NY','CA','CA','TX','CA','NY'],
                   'point': [64,24,70,70,88,57]}
                  )

# 인덱스를 name으로 설정
df_i = df.set_index('name')

# state를 인덱스로 추가
# 인덱스는 name과 state로 설정
df_mi = df_i.set_index('state', append=True)
print(df_mi)
#                age  point
# name    state
# Alice   NY      24     64
# Bob     CA      42     92
# Charlie CA      18     70
# Dave    TX      68     70
# Ellen   CA      24     88
# Frank   NY      30     57

# state와 name 인덱스 위치를 변경
print(df_mi.swaplevel(0, 1))
#                age  point
# state name
# NY    Alice     24     64
# CA    Bob       42     92
#       Charlie   18     70
# TX    Dave      68     70
# CA    Ellen     24     88
# NY    Frank     30     57

 

인덱스 설정 해제

설정한 인덱스를 삭제하는 방법을 알아보겠습니다.

인덱스를 제거하기 위해서는 reset_index()를 사용합니다.

import pandas as pd

df = pd.DataFrame({'name': ['Alice','Bob','Charlie','Dave','Ellen','Frank'],
                   'age': [24,42,18,68,24,30],
                   'state': ['NY','CA','CA','TX','CA','NY'],
                   'point': [64,24,70,70,88,57]}
                  )

# 인덱스를 name으로 설정
df_i = df.set_index('name')
print(df_i)
#          age state  point
# name
# Alice     24    NY     64
# Bob       42    CA     92
# Charlie   18    CA     70
# Dave      68    TX     70
# Ellen     24    CA     88
# Frank     30    NY     57

# 인덱스 삭제
df_ri = df_i.reset_index()
print(df_ri)
#       name  age state  point
# 0    Alice   24    NY     64
# 1      Bob   42    CA     92
# 2  Charlie   18    CA     70
# 3     Dave   68    TX     70
# 4    Ellen   24    CA     88
# 5    Frank   30    NY     57

 

인덱스를 재설정 하고 싶은 경우에도 reset_index()를 사용합니다.

기존에 있는 인덱스를 reset_index()로 제거하고 set_index()로 다시 설정합니다.

import pandas as pd

df = pd.DataFrame({'name': ['Alice','Bob','Charlie','Dave','Ellen','Frank'],
                   'age': [24,42,18,68,24,30],
                   'state': ['NY','CA','CA','TX','CA','NY'],
                   'point': [64,24,70,70,88,57]}
                  )

# 인덱스를 name으로 설정
df_i = df.set_index('name')
print(df_i)
#          age state  point
# name
# Alice     24    NY     64
# Bob       42    CA     92
# Charlie   18    CA     70
# Dave      68    TX     70
# Ellen     24    CA     88
# Frank     30    NY     57

# 인덱스 삭제
df_ri = df_i.reset_index()
print(df_ri)
#       name  age state  point
# 0    Alice   24    NY     64
# 1      Bob   42    CA     92
# 2  Charlie   18    CA     70
# 3     Dave   68    TX     70
# 4    Ellen   24    CA     88
# 5    Frank   30    NY     57

# 인덱스 재설정
df_change = df_i.reset_index().set_index('state')
print(df_change)
#           name  age  point
# state
# NY       Alice   24     64
# CA         Bob   42     92
# CA     Charlie   18     70
# TX        Dave   68     70
# CA       Ellen   24     88
# NY       Frank   30     57

 

원본 DataFrame 설정

set_index()를 사용해 인덱스를 설정하면 새로운 오브젝트를 반환합니다.

반환값 없이 원본 DataFrame에 적용하고 싶은 경우에는 inplace를 True로 설정합니다.

import pandas as pd

df = pd.DataFrame({'name': ['Alice','Bob','Charlie','Dave','Ellen','Frank'],
                   'age': [24,42,18,68,24,30],
                   'state': ['NY','CA','CA','TX','CA','NY'],
                   'point': [64,24,70,70,88,57]}
                  )

df.set_index('name', inplace=True)
print(df)
#          age state  point
# name
# Alice     24    NY     64
# Bob       42    CA     92
# Charlie   18    CA     70
# Dave      68    TX     70
# Ellen     24    CA     88
# Frank     30    NY     57

 

lot, at 값 취득

set_index()로 설정한 인덱스를 지정해 lot과 at으로 값을 취득하겠습니다.

import pandas as pd

df = pd.DataFrame({'name': ['Alice','Bob','Charlie','Dave','Ellen','Frank'],
                   'age': [24,42,18,68,24,30],
                   'state': ['NY','CA','CA','TX','CA','NY'],
                   'point': [64,24,70,70,88,57]}
                  )

df.set_index('name', inplace=True)

print(df)
#          age state  point
# name
# Alice     24    NY     64
# Bob       42    CA     92
# Charlie   18    CA     70
# Dave      68    TX     70
# Ellen     24    CA     88
# Frank     30    NY     57

print(df.loc['Bob'])
# age      42
# state    CA
# point    92
# Name: Bob, dtype: object

print(df.at['Bob', 'age'])
# 42

댓글