일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- dataframe
- Kotlin
- Google Spreadsheet
- Python
- Apache
- Tkinter
- c#
- PySpark
- Mac
- string
- math
- Github
- django
- gas
- PANDAS
- Google Excel
- list
- Excel
- GIT
- Java
- hive
- matplotlib
- google apps script
- array
- 파이썬
- SQL
- numpy
- Redshift
- PostgreSQL
- Today
- Total
달나라 노트
Python Pandas : iterrows (DataFrame의 행 반복하기) 본문
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를 돌릴 수 있다는 점을 유용하게 사용할 수 있을 것입니다.