본문 바로가기
파이썬/파이썬 스터디

반복문으로 df 내의 모든 행의 값 텍스트로 적어주기 - iterrows

by davi_kr 2023. 5. 12.

목차

    반응형

    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()를 사용하는 등, 상황에 맞게 여러 메소드를 잘 활용하면 보다 효율적인 데이터 처리가 가능합니다.

     

    반응형

    댓글