[pandas] dataframe 행 추가/제거

pandas dataframe 행 추가

1. append()

2. loc()

 

pandas 라이브러리에서 dataframe 자료형에 행을 추가하는 방법을 정리한다. 

예제의 자료는 전 국민의 데이터인 kaggle 타이타닉 데이터셋의 train에서 몇 가지 컬럼만 가져와 사용하였다.

import pandas as pd
df = pd.read_csv('./dataset/data_titanic/train.csv')
df = df[['PassengerId', 'Survived','Name','Sex']]
df


1. append() 

appned() 메서드는 데이터프레임에 행을 추가하는 대표적인 방법이다. 

새롭게 추하가는 자료의 형태는 시리즈나 딕셔너리, 데이터프레임 모두 사용 가능하다. 

 

우선은 딕셔너리 형태의 새로운 행을 추가해 보자.

# 1. append() : dictionary or series
new_row =  {'Survived':'1', 'Name':'Jay,Oh', 'Sex':'male'}
df.append(new_row)

새로 추가되는 행이 index 값이 설정되어 있지 않으므로 ingore_index=True 옵션을 통해 추가되는 행의 인덱스를 무시해서 넣어야 한다.

df2 = df.append(new_row, ignore_index=True)
df2

 

다음으로 추가할 행을 데이터프레임 자료형으로 변환한 뒤 append 메서드를 사용한다.

# 2. append() : dataframe
new_row =  [(1, 'Jay,Oh','male')]
new_row = pd.DataFrame(new_row, columns=df.columns
new_row

df3 = df.append(new_row)
df3

데이터프레임 자료형의 경우 서로의 인덱스가 상충하므로 ignore_index 옵션을 설정하지 않으면 위와 같이 원본의 인덱스를 모두 살린 후 합쳐진다. igore_index=True의 경우 행을 추가하려는 기존 데이터프레임의 인덱스를 따르게 된다.

df3 = df.append(new_row, ignore_index=True)
df3

참고: pandas.DataFrame.append

 

2. loc : 인덱스명 이용하기

원본 데이터 프레임을 바꾸면 실습하기 힘들어서 따로 카피해놓고 시작한다.

df4 = df.copy()
df5 = df.copy()

loc는 label 값으로 인덱싱을 하는 방법인데 지금 예제의 자료는 행의 인덱싱 숫자가 그대로 사용되었다.

제일 마지막에 새로운 행을 추가하기 위해서 기존의 데이터프레임의 마지막 행의 인덱스를 가져와 본다.

df.iloc[-1:]

기존 데이터 프레임의 마지막 인덱스가 890이므로 891을 인덱스 명으로 행을 추가한다. (아니어도 상관은 없음)

# loc[] : index명 이용
df4.loc['891'] = [1, 'Jay,Oh','male']
df4

 

iloc[]

수정은 가능 but 추가는 불가

# iloc[] : location 이용 -> 추가는 불가능
df5.iloc[891] = [1, 'Jay,Oh','male']
df5

합치려는 기존 데이터프레임의 범위를 초과할 수 없는 오류 발생!

 

concat()

concat() 으로도 가능하지만 이는 기본적으로 dataframe을 합치는 메서드 이므로 따로 다루기로 한다. 

# iloc[] : location 이용 -> 추가는 불가능
df5.iloc[891] = [1, 'Jay,Oh','male']
df5

 

 

pandas dataframe 행 제거

drop()

DataFrame.drop(labels=None, axis=0, index=None, columns=None, level=None, inplace=False, errors='raise')

 

dataframe에서 행, 열 제거 모두 사용되는 대표적인 방법이다.

axis=0 이 행이고 default 값이며, 열 삭제를 위해서는 aixs=1로 입력한다.

drop 메서드는 본래의 데이터가 바뀌지 않으므로 inplace=True 옵션이나 객체로 다시 지정해야 한다.

 

* inplace=True, False(defalult)

  • True : 기존 데이터프레임 자체가 변경
  • False : 기존 데이터프레임 copy후 적용한 결과 반환 → 기존 데이터 프레임은 변경 안됨

df.drop(0,inplace=True)
# same
# df = df.drop(0)
df

첫번째 행 index을 넣어 drop(0, inplace=True)로 제거한 모습이다.