본문 바로가기

데이터분석/pandas

pandas 개념1 기본(head,tail,sample,shape,info) + loc, iloc, 행번호, 인덱스 이해하기

 

(들어가기에 앞서서...)

pandas는 데이터분석 하는 분들이라면 많이들 쓰는 패키지입니다. 

위에 있는 판다스 치트 시트 2장만 온전히 이해한다면 기본적인 데이터 분석은 할 수 있습니다. 

하지만, 위에 있는 pandas cheet sheet 를 온전히 이해하려면 알아야 될 게 몇 가지 있기에 그 부분들을 따로 정리하려고 합니다.

 

개인적으로 pandas cheet sheet 은 나중에 정리할 때 쓰는 것이 좋다고 생각합니다. 일단 제 나름대로 pandas 쓰면서 알아야하는 것들을 최우선으로 포스팅들을 이어나가보도록 하겠습니다.

 

--시작--

1. 기본

판다스에서는 데이터를 시리즈(Series)와 데이터프레임(DataFrame)이라는 자료형을 사용합니다. 데이터프레임은 엑셀에서 보는 시트(sheet)랑 동일한 개념이며 시리즈는 시트의 열 1개를 의미합니다. 

 

데이터를 부르면 head, tail, sample 3가지를 이용해서 데이터 프레임의 일부를 살펴봅니다. head와 tail의 default는 5입니다. 소괄호() 안에 숫자를넣으면 그 숫자만큼 head는 맨 앞 인덱스부터 tail은 맨 뒤의 인덱스부터 자료를 보여줍니다. sample은 무작위로 추출합니다. sample 메서드는 default값이 따로 없기에 보고싶은 만큼 숫자를 넣으면 되지만 보통 30을 넘어가면 중간부터 ... 으로 대체가 됩니다. 제 경험상 한 번에 많이 보려면 30까지가 최대치인 거 같습니다.

 

type을 보면 클래스가 pandas 어쩌구 dataframe이라고 나오는 것을 확인할 수 있습니다. shape은 전체의 로우와 칼럼이 몇 개인지 보여줍니다. info의 경우 null값이 몇 개 인지와 데이터 타입을 보여줍니다. pandas 에서는 문자열인 string을 object라고 표현하며 int는 int64, float은 float64, datetime은 datetime64라고 표현합니다.

 

2. loc,iloc 

loc와 iloc는 데이터를 추출할 때 사용합니다. 1개의 열만 추출하면 시리즈(Series)를 얻고 2개 이상의 열을 추출하면 데이터프레임(Dataframe)을 얻습니다. 

 

country 열을 추출하여서 따로 저장합니다. type을 보면 Series라는 것을 확인할 수 있습니다. 

 

다음으로 열 이름이 country, continent, year인 열을 추출하여 변수 subset에 저장했습니다. 이 때는 type이 데이터프레임을 확인할 수 있습니다. 

 

loc : 인덱스 기준으로 행 데이터 추출

iloc : 행 번호를 기준으로 행 데이터 추출

 

보통 프로그래밍에서 저장된 데이터의 순서를 인덱스라고 부릅니다. 하지만 판다스에서는 이를 '행 번호'라고 부릅니다.(인덱스는 조금 다르게 사용합니다)

 

처음에 데이터를 불러와서 head메서드를 사용한 결과물입니다. 제일 왼쪽에 번호가 보이나요? 이것이 pandas의 인덱스입니다. 현재 상태만 보면 뭐가 다르지? 라고 생각할 수 있습니다. 행 데이터가 추가,삭제가 일어나면 숫자가 중간중간 비거나 하는 경우가 생깁니다. 나중에 불리언 인덱싱을 이용하거나 중복값 또는 na값을 제거하면 인덱스가 중간중간 비어버리고 맨 처음 상태의 인덱스가 남습니다. (그럴 경우 reindex를 따로 해줘야합니다) 또한, pandas의 인덱스는 문자열로 사용할 수 있습니다. 

 

반면 행 번호데이터의 순서를 따라가기 때문에 정수만으로 데이터를 조회하거나 추출할 수 있으며 실제 데이터프레임에서는 위처럼 확인할 수 없습니다. 계속 보겠습니다. 

 

loc 속성에 대괄호를 이용하여 인덱스(=추출할때 제일 왼쪽에 나오는 번호)를 전달하면 행 데이터를 추출할 수 있습니다. 이 때, 하나의 인덱스 값만 넣는다면 Series 형태로 return 되는 것을 확인할 수 있습니다. 

 

** 마지막 행 데이터 추출법**

만약 loc를 이용하여 마지막 행 데이터를 추출하려고 한다면? 

마지막 행 데이터의 인덱스를 알아야내야 합니다. shape를 이용하는 방법과 tail 메서드를 이용하는 방법 2가지가 있습니다. 또한, loc에서 하나의 인덱스만 넣으면 Series 형태로 반환되는데 2개 이상의 인덱스를 넣으면 데이터프레임 형태로 출력됨을 확인할 수 있습니다. 

 

정리하자면

 

 

 

tail 메서드와 loc 속성이 반환하는 데이터의 자료형이 다릅니다. 또, loc 에서 인덱스를 하나의 값만 넣는 것과 2개 이상의 값을 넣는것도 반환하는 데이터의 자료형이 다릅니다. 위 코드에서 이를 확인해서 기억해두세요!

 

iloc 속성 알아보기

iloc 속성은 데이터 순서를 의미하는 행 번호를 사용하여 데이터를 추출합니다. 

 

iloc 속성에서는 음수를 사용해도 데이터를 추출할 수 있습니다. -1을 통해 마지막 행 데이터 추출하는 것을 위에서 확인할 수 있습니다. 하지만 데이터프레임에 아예 존재하지 않는 행 번호를 전달하면 오류가 발생합니다. shape을 이용해서 나오는 로우의 숫자보다 큰 숫자는 입력을 안하는 것이 좋습니다. 

 

 iloc도 loc와 마찬가지로 2개 이상의 행번호를 넣어주면 데이터프레임을 반환되는 것을 확인할 수 있습니다. 

 

/* 현재 iloc에서 쓰이는 행번호와 앞에서 썼던 인덱스가 동일하게 보이지만 실제로는 다르게 적용됩니다. 이 포스팅 제일 마지막에 이를 보여주는 예시를 만들었습니다. 그러니 끝까지 읽어주시면 됩니다 :) */

 

loc, iloc 활용하기 

두 속성 모두 추출할 데이터의 행을 먼저 지정하고 그런 다음 열을 지정하는 방법으로 데이터를 추출합니다. 즉, df.loc[[행],[열]] 이나 df.iloc[[행],[열]]과 같은 방법으로 코드를 작성하시면 됩니다. 

 

좀더 구체적으로 얘기를 해드리면 

 df.loc[ [행=정수] , [열=칼럼명] ]

 df.iloc[ [행=정수] , [열=정수] ]

콤마를 기준으로 행과 열이 나뉩니다. 행은 무조건 인덱스든 행번호든 정수가 들어가야겠죠? 그리고 열에는 loc의 경우에는 열 부분에 칼럼명을 입력해줘야 합니다. 칼럼명은 보통 문자타입(object)입니다.  

 

위 코드를 보면 행 부분(=콤마앞)은 :(콜론) 만 들어가있습니다. 이 뜻은 모든 행을 의미합니다. loc에서는 'year', 'pop' 칼럼 2개를 선택해서 살펴보았습니다. iloc 에서 바로 위의 head를 보시면 country 부터 0,1,2 식으로 적용됩니다. 칼럼이 6개니깐 0~4까지가 칼럼의 인덱스 번호가 되겠습니다. iloc에서 2는 2번째 인덱스(0번쨰 인덱스는 country)인 year입니다. 나머지도 똑같이 보시면 되고 -1은 마지막 인덱스인거 아시죠...? ㅎㅎ 

 

자, 그러면 슬라이싱을 loc 와 iloc 를 통해 해보겠습니다.

 

콤마 왼쪽은 행 범위, 오른쪽은 열 범위라고 했습니다. iloc 의 경우 좌우 모두 정수가 들어갑니다. :(콜론)을 기준으로 원하는 범위들을 입력해주면 됩니다. 열의 경우 칼럼의 순서를 보고 그 갯수만큼 0부터 인덱스가 시작한다는거 유념해서 슬라이싱을 하면되구요. 그런거때문에 loc가 저는 좀 더 낫다고 생각합니다. 여기선 열 범위 부분에 정확히 칼럼명을 적어줘야하니깐 다른 사람이 봐도 쉽게 이해할 수 있으니깐요! 

 

위 코드에서 열 범위 부분이 좀 이상하죠? 몇몇 분은 감이 오시겠지만 0:6은 처음과 끝 범위이고 :2 는 step 입니다. 2칸씩 건너뛰어라 라는 의미죠. 

 

이제 제 설명이 충분히 이해가 됐다면 바로 위의 코드들이 이해가 되실겁니다. 콤마 왼쪽은 행 범위, 오른쪽은 열 범위이고

loc 일 때 열 범위는 칼럼 이름을 직접 적어줘야하고, iloc일때 열 범위는 칼럼의 인덱스 순서이다! 이게 핵심!

인덱스와 행번호 차이 확인하기 - 중요합니다!

앞에서 언급한 인덱스와 행번호 차이를 보여드리겠습니다. 말보다는 직접 보여드리는 것이 낫다고 생각했습니다.

 

기존의 dataframe 에서 2,4,6 인덱스를 drop 으로 행을 날렸습니다. 그 뒤, head로 10개의 로우를 부르면 2,4,6 인덱스가 사라진 것을 확인할 수 있습니다. 

 

똑같이 두 속성의 행 범위 (콤마앞)에 [0,1,3]을 넣었는데 나오는 값이 달라졌습니다. 먼저, loc 속성에서 0,1,3 인덱스를 부르라고 하니깐 왼쪽 숫자가 0,1,3 이 달려있는 애들을 그대로 가져왔습니다. 

 

문제는 행번호가 적용되는 iloc 입니다. 행번호는 데이터프레임에 표시가 안됩니다. 

행번호는 인덱스와 다르다고 했죠? head부분을 보면 첫 번째 로우가 행번호 0입니다. 그다음 행번호 1, 행번호 2 이렇게 진행됩니다. iloc 에서 행번호 0,1,3 인 로우 부르라고 하니깐 인덱스 번호가 0,1,5인 애들이 왔습니다. head를 보시면서 첫 줄이 행번호0 부터 그다음 1로 내려간다는걸 이해하면 왜 저렇게 나오는지 이해가 될 것입니다. 

 

자, 그러면 좀 더 보겠습니다. 

 

loc 에서는 인덱스번호 (데이터프레임 왼쪽의 숫자)가 2에서 7사이인 애들을 가져왔고, iloc에서는 행번호 2번째부터 마지막 7 제외한 6번째 행번호까지 그대로 가져왔습니다. head 기준으로 행번호 보세요!

 

이상이 판다스와 행번호와 인덱스의 차이입니다. 정리하자면 인덱스는 왼쪽의 숫자(문자일 수도 있습니다), 행번호는 눈에 안보인다 그냥 위에서부터 차례대로 행번호가 붙여진다. 이 부분은 책에서 별도로 다루지 않아 제가 직접 살펴본 것입니다 :) 

 

-----------------------------------------------

 

판다스의 첫 시간은 많이들 헷갈려하는 loc 와 iloc 를 다루어 보았습니다. 행번호와 인덱스의 차이를 명확히 아시길 바랍니다. 아마도 loc를 많이 쓸 것입니다. reindex만 잘해주면 loc 가 좀 더 나을거라고 판단되기 때문입니다. (물론 전 아직 경력이 없으니 이런건 알아서 걸러서 들으시길...ㅠㅠ)

 

위의 포스팅은 Do it! 데이터 분석을 위한 판다스 입문 (출판사: 이지스퍼블리싱)를 중심으로 정리한 포스팅입니다. 판다스 관련 입문서로 추천하는 책입니다. 물론 판다스의 창시자인 웨스 매키니의 '파이썬 라이브러리를 활용한 데이터 분석 (2판)'도 좋지만 저는 do it 책을 먼저 보고 웨스 맥키니의 책을 보는 것을 추천드립니다 :)