PL/Python

데이터프레임에서 for loop을 사용하는 다양한 방법

PIYA 2022. 10. 28.

포스팅 목적

데이터프레임을 for문으로 다루는데,

생각한대로 잘 안된다.

 

아주 기본적인 내용인데, 이런것도 모르는 난 바본가..?

 

 

공부해보자!

예제 데이터셋

 

단순한 데이터프레임을 꾸렸다.

요기서 어떻게 순차적으로 데이터를 꺼내는지 실습해보자.

 

import pandas as pd

df = pd.DataFrame([['김가영', 'Korea', 162],
                   ['이상호', 'Korea', 175],
                   ['David', 'America', 180],
                   ['변기태', 'Korea', 173]],
                  columns = ['name', 'country', 'height'],
                  index = [1,2,3,4])
df

 

인덱스값을 의도적으로 [1,2,3,4]로 주어 데이터를 한 행씩 꺼낼 때 인덱스가 유지되는지를 확인하고자 하였다.

 

 

방법1: 단순 for문을 사용할 경우

 

가장 단순한 for문을 사용해보자.

데이터프레임에서 매 반복마다 item 변수 하나로 받았다.

 

for item in df:
    print(item)
    print(type(item))

 

나는 뭔가 데이터가 한행씩 떨어져주길 기대했는데,

아래 코드에서는 str형 칼럼명만 item에 들어갔다.

 

 

위처럼 단순히 for문을 사용할 경우, 데이터프레임의 값들을 가져오지 못한다.

우리가 원하는 값들을 출력하려면?

메서드를 사용하여 반복문을 돌려야한다.

 

 

방법2: iteritems() 메서드 사용하기

 

판다스 데이터프레임의 iteritems() 메서드를 사용해보자.

pair로 (column name, Series) 를 반환한다!

 

컬럼명과 시리즈를 반환하는거 보니 원하는 데이터를 다 얻을 수 있겠군!

 

for col, ser in df.iteritems():
    print(ser)
    print(type(col), type(ser), ser.shape, '\n---\n')

 

시리즈를 먼저 출력하고, 칼럼명 타입시리즈 타입, 시리즈 shape까지 출력해보았다.

 

 

그러니까 데이터프레임에서 너낌상으로 아래와 같이 출력해주는 셈이다.

 

 

 

그런데.. 뭔가 나한테는 저렇게 칼럼기준 세로로 뽑는 방식이 아니라,

가로로 행데이터를 한건씩 뽑는게 더 잘 와닿는 것 같다.

 

세번째, 그래서 행(row)단위 데이터처리, iterrows()

 

위의 iteritems() 메서드는 칼럼명 기준으로 열데이터를 뽑는다면,

iterrows()는 행데이터를 한건씩 뽑는다. (rows 복수형 주의!)

 

 

반환형은 역시 페어로 (Index, Series).

 

for idx, ser in df.iterrows():
    print(idx, ser.shape, ser.index)
    print(ser, '\n')

 

확인하고 싶은 인덱스값, 시리즈 shape, 시리즈 index까지 같이 출력해보았다.

 

 

특히 시리즈로 반환된 마지막 변기태 데이터를 보면,

name, country, height의 칼럼명이 시리즈의 인덱스로 들어가는것을 확인할 수 있었다.

 

 

네번째, 통째로 튜플처리, itertuples()

 

iteritems()는 칼럼명과 열데이타,

iterrows()는 인덱스명과 행데이타를 뽑았다.

 

itertuples()는 통째로 하나만 리턴한다.

뭔지 확인해보자!

 

for item in df.itertuples():
    print(type(item))
    print(item)
    for i in range(len(item)):
        print(item[i])
    print('')

 

우선, 리턴하는 아이템의 형식은 type()으로 확인해보니 아래처럼 판다스 코어 프레임이라 나온다.

 

뭔지 모르겠지만, 아래처럼 [0], [1] 으로 리스트처럼 편하게 접근할 수 있게 되어있다.

 

 

 

마무리

 

사실 그런데,,

처음에 원하는 데이터를 for로 뽑으려면 메소드를 써야만 하는줄 알았는데,

아래처럼 간단하게 for loop을 쓸 수도 있었다..

 

 

for문에서 칼럼을 df['name'] 으로 지정해버리면,

해당 칼럼의 값들을 하나씩 순서대로 출력해주었고..

 

iloc[n] 을 이용하면, 마찬가지로 해당 행의 데이터도 뽑아올 수 있었다..

 

결론: 전부 다 알아야되니까 헷갈리면 처음부터 하나하나 찬찬히 봐보자.

 

덧붙이기

 

공부하다보니 더 놀라운 방법을 찾았다.

아래와 같이 zip()으로 묶어서 원하는 칼럼이나 인덱스만 출력할 수도 있었다..

심지어 마지막코드처럼 zip내에 length가 맞지 않아도 출력이되더라..

 

 

 

댓글