포스팅 목적
데이터프레임을 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가 맞지 않아도 출력이되더라..
'PL > Python' 카테고리의 다른 글
데이터프레임의 인덱스 중복과 loc 프로퍼티 (0) | 2022.11.02 |
---|---|
pandas Dataframe, Series 차이점 정리 (데이터프레임, 시리즈) (0) | 2022.10.31 |
[코드 스터디] UCI-HAR 데이터셋1: 중복칼럼 확인 (0) | 2022.10.28 |
pandas.DataFrame.apply 함수 기본 사용법 (0) | 2022.10.27 |
pandas.DataFrame.groupby 기본 사용법 (0) | 2022.10.27 |
댓글