데이터분석 공부/DSBA 4기

iloc loc Value Error 정리

이삼오 2024. 3. 11. 13:45

 

아래래의 남북한 발전 전력량 데이터에서 전력량 컬럼은 남한과 북한만, 연도 컬럼들은 1990부터 2016까지만 담은 데이터프레임을 만들고자 한다. 

 

 

df_ns = df.iloc[[0, 5], 2:]
df_ns.index = ['South', 'North']
df_ns.columns = df_ns.columns.map(int)
df_ns

 

iloc를 사용 데이터프레임을 슬라이싱하고 인덱스 이름을 South와 North로 새로 지정했다. 

df_ns = df.iloc[:6, 2:] 라는 코드로도 가능하지 않을까? 라는 생각에 코드를 작동시켰더니

 

ValueError: Length mismatch: Expected axis has 6 elements, new values have 2 elements

라는 오류가 발생했다. 

 

예상 축에는 6개 요소가 있지만 새 값에는 2개 요소가 있다는 뜻으로, 불러온 인덱스의 수와 지정한 인덱스 이름의 수가 달라서 발생한 오류이다. 

이 오류가 발생했다면 불러온 인덱스(혹은 컬럼)과 새로 지정할 인덱스(혹은 컬럼)의 이름 수를 일치시켜주면 해결된다. 

 

그런데 남한과 북한 2개 요소만 가져오려고 작성한 코드가 왜 6개 요소를 반환했을까?

새로 작성한 df.iloc[:6, 2:]는 행은 0부터 6까지, 컬럼은 2부터 끝까지 가져온다. 

기존 df.iloc[[0, 5], 2:]는 행은 0과 5를 하나씩, 컬럼은 2부터 끝까지 가져온다. 

같은 값을 가져오는 코드라고 생각했으나 전혀 다른 내용의 코드였다. 

 

 

만약 다른 코드로 같은 데이터를 반환하고 싶다면

df_ns = df.loc[[0, 5], '1990':]
df_ns.index = ['South', 'North']
df_ns.columns = df_ns.columns.map(int)
df_ns

 

라고 작성할 수 있다. loc는 iloc와 달리 인덱스나 컬럼의 값을 지정해 데이터를 슬라이싱한다. 

기존 데이터프레임은 정수형 숫자 인덱스를 가지고 있으므로 행은 [0, 5]로 지정, 컬럼은 값 '1990':으로 지정했다. 

loc는 작성한 시작값과 끝값을 그대로 불러오고, iloc는 끝값-1을 불러오는 것을 잊지 말자.