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
댓글