달나라 노트

Python Pandas : iterrows (DataFrame의 행 반복하기) 본문

Python/Python Pandas

Python Pandas : iterrows (DataFrame의 행 반복하기)

CosmosProject 2021. 8. 23. 12:24
728x90
반응형

 

 

 

 

 

DataFrame을 다루다보면 DataFrame에 있는 하나하나의 행을 참조하여 for loop를 돌리는 등의 경우가 발생합니다.

 

이럴때에는 여러 가지 방법이 있지만 그 중에서 pandas에서 제공하는 iterrows를 사용해봅시다.

 

 

 

 

import pandas as pd

dict_1 = {
    'col1': [4, 1, 5, 3, 2],
    'col2': [6, 7, 8, 9, 10],
    'col3': [11, 12, 13, 14, 15],
    'col4': [16, 17, 18, 19, 20]
}

df_1 = pd.DataFrame(dict_1)
print(df_1)

print(df_1.iterrows())



-- Result
   col1  col2  col3  col4
0     4     6    11    16
1     1     7    12    17
2     5     8    13    18
3     3     9    14    19
4     2    10    15    20

<generator object DataFrame.iterrows at 0x7f82101cb350>

iterrows는 DataFrame에 적용할 수 있으며 그 결과로 iterrows 객체를 return합니다.

iterrows 객체는 쉽게말해서 DataFrame의 각 행의 정보를 담은 객체라고 보면 됩니다.

 

그러면 구체적으로 iterrows 객체가 어떻게 생겼는지 봅시다.

 

 

 

 

 

 

import pandas as pd

dict_1 = {
    'col1': [4, 1, 5, 3, 2],
    'col2': [6, 7, 8, 9, 10],
    'col3': [11, 12, 13, 14, 15],
    'col4': [16, 17, 18, 19, 20]
}

df_1 = pd.DataFrame(dict_1)

for row in df_1.iterrows():
    print(row)



-- Result
(0, col1     4
col2     6
col3    11
col4    16
Name: 0, dtype: int64)

(1, col1     1
col2     7
col3    12
col4    17
Name: 1, dtype: int64)

(2, col1     5
col2     8
col3    13
col4    18
Name: 2, dtype: int64)

(3, col1     3
col2     9
col3    14
col4    19
Name: 3, dtype: int64)

(4, col1     2
col2    10
col3    15
col4    20
Name: 4, dtype: int64)

iterrows 객체를 for loop로 이용하여 iterrows 객체에 있는 정보를 하나씩 print한 모습입니다.

iterrows 객체는 보면 아래와 같은 형태의 데이터를 가지고있습니다.

(index, row_series)

 

for loop가 돌면서 출력되는 하나하나를 보면 tuple의 형태로 출력됨을 볼 수 있고,

tuple의 첫 번째 데이터 자리에는 DataFrame의 index 정보가 들어있으며

두 번째 데이터로는 해당 index를 가지는 DataFrame의 행 정보가 Series의 형태로 들어있습니다.

 

 

 

 

 

 

import pandas as pd

dict_1 = {
    'col1': [4, 1, 5, 3, 2],
    'col2': [6, 7, 8, 9, 10],
    'col3': [11, 12, 13, 14, 15],
    'col4': [16, 17, 18, 19, 20]
}

df_1 = pd.DataFrame(dict_1)

for row in df_1.iterrows():
    print(type(row[0]))
    print(type(row[1]))



-- Result
<class 'int'>
<class 'pandas.core.series.Series'>

<class 'int'>
<class 'pandas.core.series.Series'>

<class 'int'>
<class 'pandas.core.series.Series'>

<class 'int'>
<class 'pandas.core.series.Series'>

<class 'int'>
<class 'pandas.core.series.Series'>

위처럼 tuple의 첫 번째는 DataFrame의 index이므로 int type이며

두 번째 데이터는 DataFrame의 row를 나타내므로 Series type인 것을 알 수 있습니다.

 

 

 

 

 

 

import pandas as pd

dict_1 = {
    'col1': [4, 1, 5, 3, 2],
    'col2': [6, 7, 8, 9, 10],
    'col3': [11, 12, 13, 14, 15],
    'col4': [16, 17, 18, 19, 20]
}

df_1 = pd.DataFrame(dict_1)
print(df_1)

for row in df_1.iterrows():
    print('index={idx} --> col1={col1}, col2={col2}, col3={col3}, col3={col4}'\
          .format(idx=row[0],
                  col1=row[1]['col1'],
                  col2=row[1]['col2'],
                  col3=row[1]['col3'],
                  col4=row[1]['col4']))



-- Result
   col1  col2  col3  col4
0     4     6    11    16
1     1     7    12    17
2     5     8    13    18
3     3     9    14    19
4     2    10    15    20

index=0 --> col1=4, col2=6, col3=11, col3=16
index=1 --> col1=1, col2=7, col3=12, col3=17
index=2 --> col1=5, col2=8, col3=13, col3=18
index=3 --> col1=3, col2=9, col3=14, col3=19
index=4 --> col1=2, col2=10, col3=15, col3=20

따라서 위처럼 row[1]으로 Series를 가져온 후, 해당 series의 index(col1 또는 col2 또는 col3 또는 col4)를 이용하면 해당 행의 col1, col2, col3, col4에 대한 값을 참조할 수 있죠.

 

이런식으로 DataFrame을 반복문을 돌려 분석에 이용할 수 있습니다.

 

 

 

 

 

 

import pandas as pd

dict_1 = {
    'col1': [4, 1, 5, 3, 2],
    'col2': [6, 7, 8, 9, 10],
    'col3': [11, 12, 13, 14, 15],
    'col4': [16, 17, 18, 19, 20]
}

df_1 = pd.DataFrame(dict_1)
print(df_1)

df_1_sorted = df_1.sort_values(by=['col1'], ascending=True, ignore_index=False, inplace=False)
print(df_1_sorted)

for row in df_1_sorted.iterrows():
    print('index={idx} --> col1={col1}, col2={col2}, col3={col3}, col3={col4}'\
          .format(idx=row[0],
                  col1=row[1]['col1'],
                  col2=row[1]['col2'],
                  col3=row[1]['col3'],
                  col4=row[1]['col4']))



-- Result
   col1  col2  col3  col4
0     4     6    11    16
1     1     7    12    17
2     5     8    13    18
3     3     9    14    19
4     2    10    15    20

   col1  col2  col3  col4
1     1     7    12    17
4     2    10    15    20
3     3     9    14    19
0     4     6    11    16
2     5     8    13    18

index=1 --> col1=1, col2=7, col3=12, col3=17
index=4 --> col1=2, col2=10, col3=15, col3=20
index=3 --> col1=3, col2=9, col3=14, col3=19
index=0 --> col1=4, col2=6, col3=11, col3=16
index=2 --> col1=5, col2=8, col3=13, col3=18

여기서 한 가지 주의할 점은 iterrows가 갖게되는 행 순서는 DataFrame의 index와는 상관 없이

iterrows가 적용된 DataFrame의 가장 위쪽 행부터 참조한다는 것입니다.

 

위 예시를 보면 df_1을 col1 기준으로 오름차순하여 df_1_sorted라는 DataFrame을 만들었습니다.

print(df_1)의 결과를 보면 df_1의 index가 0, 1, 2, 3, 4 처럼 순차적으로 되어있습니다.

 

그러나 print(df_1_sorted)의 결과를 보면 df_1_sorted는 col1을 기준으로 정렬되었으므로 index도 1, 4, 3, 0, 2 순서로 되어있습니다.

col1 기준으로 정렬되는 과정에서 index도 바뀐것이죠.

 

이 상태에서 iterrows를 적용하면

index가 작은 순서인 0, 1, 2, 3, 4 순서대로 row를 참조하는게 아니라

df_1_sorted에 있는 행의 순서 그대로 row를 참조하게됩니다.

 

그래서 반복문의 결과를 보면 index가 1, 4, 3, 0, 2 순서대로 출력된 것을 볼 수 있죠.

 

 

이러한 특성을 알면 iterrows를 이용할 때

index 기준으로 반복문을 돌리지 않고,

현재 DataFrame의 index가 어떤식으로 되어있건 상관없이

DataFrame의 첫 번째 행부터 차례대로 for loop를 돌릴 수 있다는 점을 유용하게 사용할 수 있을 것입니다.

 

 

 

 

 

 

 

728x90
반응형
Comments