개발고생일지/파이썬

pandas dataframe(데이터프레임) index(행) 추가

Fartist 2023. 3. 25. 23:59
- 목차
들어가는 말
1. .loc[] = [] 으로 행 추가하기
2. .concat() 으로 여러 행 추가하기
3. .concat()과 .iloc[:] 으로 원하는 위치에 행 추가하기
갈무리

[그림 1] 데이터프레임 행 추가
[그림 1] 데이터프레임 행 추가


들어가는 말

 저번 게시글에서는 데이터프레임에서 열을 추가하는 방법에 대해서 알아보았다면, 이번에는 행(index)을 추가하는 방법에 대해서 알아보도록 하겠습니다. 크게 3가지 방식이 있습니다. .loc[] = [] 의 형태로 새로운 행을 제일 밑에서부터 추가하는 방법. 또는 .concat() 메서드로 다른 데이터프레임을 합치는 방식으로 행을 추가하는 방법. 마지막으로 .concat()과 iloc[:]으로 원하는 위치에 행을 추가하는 방법입니다. 본인의 필요에 맞게 알맞은 방식을 사용하시기 바랍니다.


 

 행을 추가하는 방법에 대해 알아보기 앞서 임의의 데이터프레임을 하나 만들어줍니다.

import pandas as pd

user_id = ['apple', 'banana', 'coconut']
user_name = ['홍길동', '김철수', '이미숙']
user_email_addr = ['apple@gaegosaeng.com', 'banana@gaegosaeng.com','coconut@gaegosaeng.com']

df_01 = pd.DataFrame({'ID': user_id, '이름': user_name, 
                     'E-mail': user_email_addr})

[코드 1] 임의의 데이터프레임

[그림 2] 임의의 데이터프레임
[그림 2] 임의의 데이터프레임


1.  .loc[] = [] 으로 행 추가하기

1) 기본적인 방법

#loc[index명] = [] 방식으로 행 추가하기
df_01.loc[3] = ['durian', '오경자', 'durian@gaegosaeng.com']

df_01.info
#<bound method DataFrame.info of         ID   이름                  E-mail
#0    apple  홍길동    apple@gaegosaeng.com
#1   banana  김철수   banana@gaegosaeng.com
#2  coconut  이미숙  coconut@gaegosaeng.com
#3   durian  오경자   durian@gaegosaeng.com>

[코드 2] .loc[] = []를 이용한 행 추가

[그림 3] .loc[] = [] 를 이용한 행 추가
[그림 3] .loc[] = [] 를 이용한 행 추가

 .loc[x] = [y] 메서드는 x에는 원하는 인덱스 이름(행 이름)을 기입하고 y에는 그 행에 들어갈 데이터 값을 리스트 타입으로 넣어주어 사용할 수 있습니다. 


2) '리스트의 개수 == 열의 개수'가 안 맞으면 오류

 만약 y의 위치에 알맞은 열의 개수만큼의 데이터 값을 넣어주지 않으면 오류 메시지를 내보내면서 코드가 작동하지 않습니다.

#열의 개수가 안 맞으면 오류
df_01.loc[4] = ['egg', '고호민',]

#ValueError: cannot set a row with mismatched columns

[코드 3] .loc[] = []에서 데이터 값의 개수가 열의 개수와 일치하지 않는 경우


3) 데이터가 없다면 None이나 빈 문자열로 처리

 만약 특정 열에 기입할 데이터 값이 없다면 'None'을 이용해 빈 데이터 값을 표현해줍니다.

#데이터가 없다면 None이나 빈 문자열을 입력
df_01.loc[4] = ['egg', '고호민', None]

df_01.info
#<bound method DataFrame.info of         ID   이름                  E-mail
#0    apple  홍길동    apple@gaegosaeng.com
#1   banana  김철수   banana@gaegosaeng.com
#2  coconut  이미숙  coconut@gaegosaeng.com
#3   durian  오경자   durian@gaegosaeng.com
#4      egg  고호민                    None>

[코드 4] 데이터가 없다면 'None'으로 빈 데이터 값을 채운다.


4) .loc[]에서 대괄호[] 안에 들어갈 index가 연속이 아닐 때

 .loc[]에서 대괄호[] 안에 들어가는 index값이 반드시 연속일 필요는 없습니다. 다음 [코드 5]는 연속하지 않는 index값을 기입했을 때 작동하는 데이터프레임의 모습입니다.

df_01.loc[6] = ['food', '강민호', 'food@gaegosaeng.com']

df_01.info
#<bound method DataFrame.info of         ID   이름                  E-mail
#0    apple  홍길동    apple@gaegosaeng.com
#1   banana  김철수   banana@gaegosaeng.com
#2  coconut  이미숙  coconut@gaegosaeng.com
#3   durian  오경자   durian@gaegosaeng.com
#4      egg  고호민                    None
#6     food  강민호     food@gaegosaeng.com>

[코드 5] 연속하지 않는 index값을 입력했을 때


5) .loc[]에서 중간에 빈 index를 값으로 지정하면 그 위치에 행이 추가 될까?

 그렇다면 .loc[]의 대괄호 안에 index값을 비어있는 인덱스 값, 예를 들면 방금 index로 6을 입력하면서 생긴 비어있는 index = 5를 새롭게 추가하는 행에 할당하면 새로운 행은 index = 4와 index = 6 사이에 자동으로 추가 될까요?

df_01.loc[5] = ['google', '서민재', 'google@gaegosaeng.com']

df_01.info
#<bound method DataFrame.info of         ID   이름                  E-mail
#0    apple  홍길동    apple@gaegosaeng.com
#1   banana  김철수   banana@gaegosaeng.com
#2  coconut  이미숙  coconut@gaegosaeng.com
#3   durian  오경자   durian@gaegosaeng.com
#4      egg  고호민                    None
#6     food  강민호     food@gaegosaeng.com
#5   google  서민재   google@gaegosaeng.com>

[코드 6] 비어있는 index값을 입력하여 새로운 행을 추가했을 때

 [코드 6]을 보면 새롭게 추가한 행이 index값과는 무관하게 제일 하단에 추가된 것을 볼 수 있습니다. index 순으로 데이터값을 순서대로 나열하고 싶다면 행 추가와는 별개로 데이터 정렬을 해주어야 인덱스 순으로 데이터 값이 나열됩니다.


6) 이미 있는 index를 값으로 지정하면? (교체)

 이번에는 이미 있는 index값을 입력하면 어떻게 될까요?

df_01.loc[0] = ['hodu', '원기둥', 'hodu@gaegosaeng.com']

df_01.info
#<bound method DataFrame.info of         ID   이름                  E-mail
#0     hodu  원기둥     hodu@gaegosaeng.com
#1   banana  김철수   banana@gaegosaeng.com
#2  coconut  이미숙  coconut@gaegosaeng.com
#3   durian  오경자   durian@gaegosaeng.com
#4      egg  고호민                    None
#6     food  강민호     food@gaegosaeng.com
#5   google  서민재   google@gaegosaeng.com>

[코드 7] 이미 존재하는 index값을 입력했을 때

 [코드 7]을 보면 이미 존재하는 index값 '0'을 새롭게 추가하는 행의 index값으로 지정했습니다. 그 결과 de_01.info로 데이터프레임을 열람해보면, 기존에 있던 데이터 행이 새롭게 추가한 행으로 대체된 것을 확인할 수 있습니다. 이것으로 기존에 있는 index값을 입력하면 제일 하단에 행이 추가되는 것이 아니라, 기존의 행이 교체되는 것을 알 수 있습니다.


2.  .concat() 으로 여러 행 추가하기

.concat()은 데이터프레임을 합치는 데 사용하는 메서드입니다. 이 메서드를 이용해 여러 행을 가진 데이터프레임을 기존의 데이터프레임에 추가할 수 있습니다.

#.concat()으로 여러 행 추가하기
df_02 = pd.DataFrame({'ID': ['iron', 'jazz'], '이름': ['김김김', '이이이'], 'E-mail': ['iron@gaegosaeng.com', 'jazz@gaegosaeng.com']})

df_02.info
#<bound method DataFrame.info of      ID   이름               E-mail
#0  iron  김김김  iron@gaegosaeng.com
#1  jazz  이이이  jazz@gaegosaeng.com>


#.concat()사용 예시
df_03 = pd.concat([df_01,df_02], ignore_index=True)

df_03.info
#<bound method DataFrame.info of         ID   이름                  E-mail
#0     hodu  원기둥     hodu@gaegosaeng.com
#1   banana  김철수   banana@gaegosaeng.com
#2  coconut  이미숙  coconut@gaegosaeng.com
#3   durian  오경자   durian@gaegosaeng.com
#4      egg  고호민                    None
#5     food  강민호     food@gaegosaeng.com
#6   google  서민재   google@gaegosaeng.com
#7     iron  김김김     iron@gaegosaeng.com
#8     jazz  이이이     jazz@gaegosaeng.com>

[코드 8] .concat()을 활용한 여러 행 추가하기

 [코드 8]을 보면 임의로 만든 두 행짜리 데이터프레임 'df_02'를 기존에 있던 'df_01'과 합쳐서 df_03을 만들었습니다. df_03에서 눈여겨 볼 것은 index값이 0부터 순서대로 나열되었으며, 기존에 뒤죽박죽이었던 df_01의 index값도 연속된 숫자로 재배정이 되었다는 점입니다. 이는 [코드 9]에 있는 'ignore_index=True'때문입니다.

할당할 데이터프레임 = pd.concat([합치고픈 데이터프레임1,합치고픈 데이터프레임2], ignore_index=True)

#할당할 데이터프레임은 1)빈 데이터프레임이어도 되고, 2)합치고픈 데이터프레임 중에서 하나여도 됩니다.

[코드 9] .concat()메서드 살펴보기

  ignore_index 인자는 글자 그대로 index를 무시할 것인지 알리는 Bool 타입 인자입니다. True를 할당하면 기존의 인덱스 값을 전부 무시하고 위에서부터 차례대로 숫자형 인덱스를 할당합니다. 

 만약 기존에 가지고 있던 데이터프레임 명을 그대로 사용하고 싶다면 '할당할 데이터프레임'에 합치고픈 데이터프레임 중에서 원하는 것 하나를 사용해도 됩니다. 


3.  .concat()과 .iloc[:] 으로 원하는 위치에 행 추가하기

 이번에는 원하는 위치에 행을 추가하는 방법에 대해서 알아보겠습니다. 

#임의의 데이터프레임 만들기
df_04 = pd.DataFrame([['kda', '박동훈', 'kda@gaegosaeng.com']], columns=df_01.columns)

df_04.info
#<bound method DataFrame.info of     ID   이름              E-mail
#0  kda  박동훈  kda@gaegosaeng.com>
#------------------------------------------------------------------------------
#.concat()과 .iloc[:]으로 원하는 위치에 행 추가하기
df_05 = pd.concat([df_03.iloc[:2], df_04, df_03.iloc[2:]], ignore_index=True)

df_05.info
#<bound method DataFrame.info of         ID   이름                  E-mail
#0     hodu  원기둥     hodu@gaegosaeng.com
#1   banana  김철수   banana@gaegosaeng.com
#2      kda  박동훈      kda@gaegosaeng.com
#3  coconut  이미숙  coconut@gaegosaeng.com
#4   durian  오경자   durian@gaegosaeng.com
#5      egg  고호민                    None
#6     food  강민호     food@gaegosaeng.com
#7   google  서민재   google@gaegosaeng.com
#8     iron  김김김     iron@gaegosaeng.com
#9     jazz  이이이     jazz@gaegosaeng.com>

[코드 10] .concat()과 .iloc[:]를 이용하여 원하는 위치에 행 추가하기

 먼저 임의의 데이터프레임 df_04를 df_03의 임의의 위치에 넣어보겠습니다. 코드를 살펴보면 다음과 같습니다.

할당할 데이터프레임 = pd.concat([원하는 위치가 있는 데이터프레임.iloc[:원하는 인덱스], 삽입하고픈 데이터프레임, 원하는 위치가 있는 데이터프레임.iloc[원하는 인덱스:]], ignore_index=True)

[코드 11] 원하는 위치에 행을 넣는 코드

 1) 할당할 데이터프레임은 본인이 원하는 데이터프레임 무엇이든 상관 없습니다.

 2) 원하는 위치가 있는 데이터프레임은 삽입될 행이 위치할 데이터프레임입니다.

 3) .iloc[:원하는 인덱스], .iloc[원하는 인덱스:]에서 원하는 인덱스는 삽입될 행이 위치할 인덱스 범위 입니다.

 4) 삽입하고픈 데이터프레임은 추가하고 싶은 행이 있는 데이터프레임을 말합니다.

 ingore_index=True 값을 이용해 행이 중간에 삽입되어도 index는 데이터 값 순으로 다시 재정렬됩니다. 


갈무리

 이상으로 pandas에서 데이터프레임의 행 추가 방법에 대해서 알아보았습니다. 추가되는 내용이 생긴다면 갈무리에서 해당 부분을 언급할 예정이오니 글이 업데이트가 된다면 이 곳을 참고하시기 바립니다. 감사합니다.

반응형