[Pandas] Dataframe의 행을 반복하는 방법 (iterrows, itertuples, index, loc, iloc)

반응형

Pandas Image

 

* 전체 코드

import pandas as pd
from pydataset import data
titanic = data('titanic') # titanic 데이터셋 가져오기
df = titanic.sample(5,random_state=90) #랜덤 5개만 가져오기

## iterrows 행 반복
for index, row in df.iterrows():
    print(f"{index=}, {row.age=}, {row['sex']=}")

## itertuples 행 반복
for row in df.itertuples():
    print(f"{row.age=}, {row.sex=}")

## df.index 사용
for idx in df.index:
    print(f"{df.loc[idx,'class']=},  {df['age'][idx]=} ({idx=})")

## iloc 사용
for i in range(len(df)):
    print(f"df.iloc[{i},0] = {df.iloc[i,0]}")

 

Contents

     

    1. 배경

    판다스의 DataFrame을 다루다 보면, for문을 통해, 행을 하나씩 반복하며 뭔가 작업을 하고 싶을 때가 있습니다. 만약 특정 조건에 따라 특정 (행, 열)에 접근하여 값을 바꾸거나 출력하거나 하는 등은 벡터화를 통해 하는 것이 훨씬 빠릅니다. for문으로 행을 하나씩 반복하는 것은 크지 않은 데이터셋에 대해, 각 행별로 여러 가지 작업을 테스트해보는 경우에 주로 적합합니다. 

     

    2. 행을 반복하는 방법

    1) 테스트 데이터셋 만들기

    import pandas as pd
    from pydataset import data
    titanic = data('titanic')
    df = titanic.sample(5,random_state=90)
    df

    먼저 각 행을 반복할 테스트 데이터셋을 만들겠습니다.

    (pydataset 설명: pydataset 이란? 700개 이상의 테스트 데이터 library )

    * 코드 설명

    테스트 데이터를 가져올 pydataset의 data모듈을 통해 titanic 데이터셋을 불러옵니다. titanic은 판다스 데이터프레임 형식으로 불러와집니다. titanic.sample(5, random_satet=90)은 titanic 데이터프레임에서 random_state(랜덤 상태) 90으로 5개의 행만 랜덤으로 가져온다는 의미입니다. random_state는 랜덤을 재현하기 위해 지정하는 파라미터입니다.

    * 출력

    테스트 데이터셋 생성

    위 데이터프레임에서 315, 1304, 318이 랜덤으로 불러와진 행의 "인덱스" 값입니다.

     

    2) iterrows 행 반복

    for index, row in df.iterrows():
        print(f"{index=}, {row.age=}, {row['sex']=}")

    * 코드 설명

    df.iterrows()를 사용하면 각 행별로 index와 row(시리즈 형태)를 반복합니다. index는 데이터프레임의 index값이고, row는 시리즈기 때문에 row.age처럼 점(.)을 통해 age 열에 접근할 수 있고, row['sex']처럼 리스트 형태로 sex 열에 접근할 수도 있습니다.

    * 출력

    iterrows() 행 반복

     

    3) itertuples 행 반복

    for row in df.itertuples():
        print(f"{row.age=}, {row.sex=}")

    * 코드 설명

    df.itertuples()는 데이터프레임의 각 행을 Pandas라는 타입의 자료형으로 반복합니다. 이 자료형은 점(.)을 통해 각 열에 접근 가능한 자료형입니다. 행 반복에 특화된 메서드라고 보시면 되겠습니다.

    * 출력

    itertuples() 행 반복

     

    4) df.index 행 반복

    for idx in df.index:
        print(f"{df.loc[idx,'class']=},  {df['age'][idx]=} ({idx=})")

    * 코드 설명

    df.index를 통해 df의 인덱스를 순차적으로 반복합니다. idx에 인덱스 값이 있으니, 인덱스를 통해 df의 행에 접근할 수 있는 2가지 방법을 사용해 보겠습니다. 첫째로, loc를 이용한 방법입니다. loc는 loc[인덱스, '열 이름']을 통해 해당 값에 접근합니다. df.loc[idx,'class']라고 하면 각 행의 class 값에 접근합니다. 두 번째로는 해당 열의 시리즈 형태에서 인덱스에 접근하는 것입니다. df['age']는 age열에 대한 시리즈 형태이고, 인덱스로 각 행에 접근할 수 있습니다. 즉, df['age'][idx]라고 하면 idx 행의 age 값에 접근합니다. 여기서 인덱스는 단순히 df의 행 순서가 아닙니다. 처음 테스트 데이터셋을 만들 때, 랜덤으로 값을 가져왔기 때문에 인덱스 값을 보면 여러 가지 값이 나오는 것을 볼 수 있습니다.

    * 출력

    df.index 행 반복 -> loc or series 사용

     

    5) iloc 사용

    for i in range(len(df)):
        print(f"df.iloc[{i},0] = {df.iloc[i,0]}")

    * 코드 설명

    이번엔 인덱스가 아니고, df의 순서를 통해 값에 접근할 수 있는 iloc에 대해 알아보겠습니다. iloc는 iloc[행순서, 열 순서]를 통해 해당 값에 접근합니다. df.iloc[0,0] 이라고하면, df에서 첫 번째 행의 첫 번째 열의 값을 가져옵니다. len(df)는 5로 for문을 통해 i는 0, 1, 2, 3, 4를 반복합니다. 이때, 첫 번째 열이 class열이니 df에서 class값들을 순차적으로 출력합니다.

    * 출력

    iloc 이용한 행 반복

     

    3. 시간 비교

    titanic 전체 데이터셋에 대해 iterrows(), itertuples(), index(loc), iloc를 통해 각 행을 for문으로 반복하며 데이터프레임의 값에 접근하여 test라는 변수에 할당하는 연산에 대해 시간을 측정하였습니다. 그 결과,iterrows()는 각 행을 시리즈 형태로 반복하기 때문에 가장 느립니다. 반대로, itertuples()는 행 반복에 어느 정도 최적화되어있기 때문에 가장 빠른 것을 확인할 수 있습니다.

    시간 비교

     

    4. 결론

    사실 데이터프레임에서 for문으로 행 반복을 하는 것은 pandas 공식 문서에서도 매우 느리기 때문에 가장 마지막 방법으로 사용하라고 나옵니다. 저는 너무 크지 않은 데이터셋인 경우, 주로 각 행별로 조건문에 따라 다른 함수를 수행하거나, 행에 이상 값이 없는지 여러 조건문을 사용할 때 주로 사용합니다. 

     

    이번엔 데이터프레임(df)에 대해 for문을 통해 각 행을 반복하는 4가지 방법에 대해 알아보았습니다.

    다음에 더 유익하고 재미있는 글로 찾아오겠습니다.

    읽어주셔서 감사합니다.

     

    * 위의 실습 코드 깃허브를 공유드립니다.

     

    GitHub - netsus/pandas_practice: Pandas examples in practice.

    Pandas examples in practice. Contribute to netsus/pandas_practice development by creating an account on GitHub.

    github.com

     

     

    Reference)
    1. Pandas Image: https://namu.wiki/w/Pandas
    2. https://www.delftstack.com/ko/howto/python-pandas/how-to-iterate-through-rows-of-a-dataframe-in-pandas/ 
    3. https://stackoverflow.com/questions/16476924/how-to-iterate-over-rows-in-a-dataframe-in-pandas
    반응형

    댓글

    Designed by JB FACTORY