목차
Python 데이터 분석에서는 Pandas의 DataFrame을 이용하여 데이터를 다루는 경우가 많습니다. 여기서는 DataFrame의 iterrows() 메소드를 활용하여 데이터를 순회하고, 각 행의 데이터를 텍스트로 변환하는 방법을 알아보겠습니다.
기본 셋팅
import pandas as pd
from datetime import datetime, timedelta
# 현재 시간부터 시작해 하루씩 증가하는 날짜 데이터를 생성합니다.
date_series = pd.date_range(start=datetime.now(), periods=5)
# 임의의 데이터를 생성합니다.
names = ['Alice', 'Bob', 'Charlie', 'Dave', 'Eve']
ages = [25, 31, 35, 19, 45]
# 생성한 데이터를 사용해 DataFrame을 생성합니다.
df = pd.DataFrame({'start_at': date_series, 'name': names, 'age': ages})
print(df)
결과)
start_at name age
0 2023-05-12 14:46:53.810292 Alice 25
1 2023-05-13 14:46:53.810292 Bob 31
2 2023-05-14 14:46:53.810292 Charlie 35
3 2023-05-15 14:46:53.810292 Dave 19
4 2023-05-16 14:46:53.810292 Eve 45
iterrows() 메소드란?
iterrows() 메소드는 Pandas DataFrame에서 제공하는 함수로, DataFrame의 각 행을 순회할 수 있게 해줍니다. 이 함수를 이용하면, 각 행을 Python의 반복문에 넣어 하나씩 처리할 수 있습니다.
이 함수는 각 반복에서 행 인덱스와 해당 행의 데이터를 반환합니다. 반환되는 행 데이터는 Pandas 시리즈 형태를 갖고 있습니다.
그래서 그 안에서 특정 값만 불러오려면 row['열이름']과 같은 형식으로 사용해야 합니다.
for index, row in df.iterrows():
formatted_date = row['start_at'].strftime('%Y-%m-%d')
print(formatted_date, row['name'], row['age'])
결과)
2023-05-12 Alice 25
2023-05-13 Bob 31
2023-05-14 Charlie 35
2023-05-15 Dave 19
2023-05-16 Eve 45
datetime.now()에서 가져온 값을 strftime으로 형태 변환을 해서 필요한 년월일만 출력하도록 변경했습니다.
이처럼 각각의 값을 호출할 수 있기 때문에 한 줄의 텍스트로 출력하려고 한다면 아래와 같이 적어주면 됩니다.
text = ""
for index, row in df.iterrows():
formatted_date = row['start_at'].strftime('%Y-%m-%d')
text += formatted_date + '에 오신 ' + str(index+1) + "번 교육생 " + row['name'] + '의 나이는 ' + str(row['age']) + '입니다.\n'
print(text)
결과)
2023-05-12에 오신 1번 교육생 Alice의 나이는 25입니다.
2023-05-13에 오신 2번 교육생 Bob의 나이는 31입니다.
2023-05-14에 오신 3번 교육생 Charlie의 나이는 35입니다.
2023-05-15에 오신 4번 교육생 Dave의 나이는 19입니다.
2023-05-16에 오신 5번 교육생 Eve의 나이는 45입니다.
주의할 점은 df 상태일 때, 숫자가 있다면 텍스트로 합쳐지지 않고
can only concatenate str (not "int") to str 오류를 반환하게 됩니다.
그래서 꼭 숫자값이 있다면 str 형태로 변환해주셔야 합니다.
iterrows()와 유사한 메소드
DataFrame에서 제공하는 itertuples()와 items() 함수도 iterrows()와 유사한 기능을 제공합니다. itertuples()는 각 반복에서 행 데이터를 namedtuple 형식으로 반환하고, items()는 각 반복에서 열 라벨과 해당 열의 데이터를 반환합니다. 아래는 각 함수의 사용 예시입니다.
for row in df.itertuples():
formatted_date = getattr(row, 'start_at').strftime('%Y-%m-%d')
print(formatted_date, row.name, row.age)
결과)
2023-05-12 Alice 25
2023-05-13 Bob 31
2023-05-14 Charlie 35
2023-05-15 Dave 19
2023-05-16 Eve 45
for label, content in df.items():
if label == 'start_at':
for date in content:
formatted_date = date.strftime('%Y-%m-%d')
print(formatted_date)
elif label in ['name', 'age']:
for item in content:
print(item)
결과)
2023-05-12
2023-05-13
2023-05-14
2023-05-15
2023-05-16
Alice
Bob
Charlie
Dave
Eve
25
31
35
19
45
언제 뭘 사용할지?
Pandas DataFrame의 iterrows() 메소드는 데이터의 각 행을 순회하며 처리하고자 할 때 유용합니다. 데이터를 텍스트로 변환하거나, 특정 조건에 따라 데이터를 필터링하거나 수정하는 등의 작업에 활용할 수 있습니다.
그러나 iterrows() 메소드가 항상 최선의 선택이 되는 것은 아닙니다. 대용량의 데이터를 다루는 경우에는 iterrows()보다 벡터화 연산을 이용하는 것이 효율적일 수 있습니다. 각 행을 순회하는 대신, 한 번의 연산으로 모든 행을 처리하는 벡터화 연산은 계산 속도를 크게 향상시킬 수 있습니다.
이 외에도, 각 행의 데이터를 namedtuple 형식으로 받아와야 하는 경우 itertuples()를, 각 열의 데이터를 순회해야 하는 경우 items()를 사용하는 등, 상황에 맞게 여러 메소드를 잘 활용하면 보다 효율적인 데이터 처리가 가능합니다.
'파이썬 > 파이썬 스터디' 카테고리의 다른 글
파이썬 pandas(판다스) groupby - 시간에 따라 묶기 (0) | 2024.08.04 |
---|---|
파이썬으로 엑셀 작업하기 - openpyxl (1) | 2023.05.12 |
맥 아나콘다 설치 및 가상환경 설정 가이드: 무료 버전 사용 방법 및 터미널, 네이게이터 활용법 (0) | 2023.04.16 |
파이썬을 이용한 구글 스프레드시트 연동 및 자동화 방법 (4) | 2023.04.12 |
파이썬 각종 db 연결(sqlalchemy, pymysql) (0) | 2023.03.29 |
댓글