본문 바로가기
공부한 것들../Pandas

Pandas DataFrame 데이터 추가 및 삭제

by bottle-an00 2024. 9. 13.

코드 프레소 [파이썬으로 배우는 Pandas] 강의 내용 정리

 

# DataFrame 데이터 추가 및 삭제..?

이전 포스팅에서 예시코드 중에 score_df['etc'] =0 을 통해 score_df에 존재하지 않는 column 인덱스인 'etc'에 0을 부여하였는데 그 결과 모든 요소가 0인 Series가 DataFrame에 추가된 것을 확인할 수 있었다. 이처럼, 데이터 추가의 방법은 아래와 같다. 

 

[열 데이터 추가 방법]

. 연산자 인덱싱을 통해 새로운 Series를 추가하는 방식으로 접근할 수 있다.

 

[행 데이터 추가 방법]

df.loc()프로퍼티를 활용해  행 데이터에 접근하여 추가할 수 있다.

 

데이터를 삭제하는 방법은 df.drop()함수를 활용하여 DataFrame의 데이터를 삭제할 수 있다. 

 

데이터 추가 방법은 이전 포스팅에서 언급한 데이터 조회 방법과 굉장히 유사하므로 예시코드로 해당 내용을 이해해보고 데이터 삭제에 사용되는 df.drop()함수는 API Reference를 살펴보고 해당 함수를 이해해보겠다. 

 

# DataFrame 데이터 추가 방법

# 열 데이터 추가 방법:: 인덱싱

import pandas as pd 

# 실습 데이터 생성
score = { 'name' : ['Jessi', 'Emma', 'Alex', 'Jessi', 'Tom'],
          'age': [20, 24, 23, 20, 27],
          'score': [100, 95, 80, 85, 97], 
          'grade': ['A','A','B','B','A'],
          'subject':['python', 'java','python', 'c','java']}
          
score_df = pd.DataFrame(data=score)
print(score_df)

semester_data = pd.Series(['20-01','20-02','21-01','21-02','20-02'])
score_df['semester'] = semester_data

print('\nAdd Columns : semester')
print(score_df)
   name  age  score grade subject
0  Jessi   20    100     A  python
1   Emma   24     95     A    java
2   Alex   23     80     B  python
3  Jessi   20     85     B       c
4    Tom   27     97     A    java

Add Columns : semester
    name  age  score grade subject semester
0  Jessi   20    100     A  python    20-01
1   Emma   24     95     A    java    20-02
2   Alex   23     80     B  python    21-01
3  Jessi   20     85     B       c    21-02
4    Tom   27     97     A    java    20-02

 

 

# 열 데이터 추가 방법:: 인덱싱 + 조건 활용

import pandas as pd 

# 실습 데이터 생성
score = { 'name' : ['Jessi', 'Emma', 'Alex', 'Jessi', 'Tom'],
          'age': [20, 24, 23, 20, 27],
          'score': [100, 95, 80, 85, 97], 
          'grade': ['A','A','B','B','A'],
          'subject':['python', 'java','python', 'c','java']}
          
score_df = pd.DataFrame(data=score)
print(score_df)

semester_data = pd.Series(['20-01','20-02','21-01','21-02','20-02'])
score_df['semester'] = semester_data

print('\nAdd Columns : semester')
print(score_df)

high_score = score_df['score'] > 90
score_df['high_score'] = high_score

print("\nAdd high_score :: ")
print(score_df)
 name  age  score grade subject
0  Jessi   20    100     A  python
1   Emma   24     95     A    java
2   Alex   23     80     B  python
3  Jessi   20     85     B       c
4    Tom   27     97     A    java

Add Columns : semester
    name  age  score grade subject semester
0  Jessi   20    100     A  python    20-01
1   Emma   24     95     A    java    20-02
2   Alex   23     80     B  python    21-01
3  Jessi   20     85     B       c    21-02
4    Tom   27     97     A    java    20-02

Add high_score :: 
    name  age  score grade subject semester  high_score
0  Jessi   20    100     A  python    20-01        True
1   Emma   24     95     A    java    20-02        True
2   Alex   23     80     B  python    21-01       False
3  Jessi   20     85     B       c    21-02       False
4    Tom   27     97     A    java    20-02        True

 

 

# 행 데이터 추가 방법:: df.loc()프로퍼티 활용 

import pandas as pd 

# 실습 데이터 생성
score = { 'name' : ['Jessi', 'Emma', 'Alex', 'Jessi', 'Tom'],
          'age': [20, 24, 23, 20, 27],
          'score': [100, 95, 80, 85, 97], 
          'grade': ['A','A','B','B','A'],
          'subject':['python', 'java','python', 'c','java']}
          
score_df = pd.DataFrame(data=score)
print(score_df)

score_df.loc[6] = ['Jina','20',100,'A','python']

print('\nAdd Row 6')
print(score_df)
   name  age  score grade subject
0  Jessi   20    100     A  python
1   Emma   24     95     A    java
2   Alex   23     80     B  python
3  Jessi   20     85     B       c
4    Tom   27     97     A    java

Add Row 6
    name age  score grade subject
0  Jessi  20    100     A  python
1   Emma  24     95     A    java
2   Alex  23     80     B  python
3  Jessi  20     85     B       c
4    Tom  27     97     A    java
6   Jina  20    100     A  python

 

# DataFrame 데이터 삭제

# API Reference

API Reference :: pandas.DataFrame.drop()

 

# Parameter 정리 

  • labels : 단일 레이블 또는 list-like 객체로, 제거할 인덱스 또는 열 레이블을 의미한다. 만약 튜플을 사용할 경우, 이는 단일 레이블로 처리되며 list-like 객체로 간주되지 않는다.
  • axis : {0 또는 'index', 1 또는 'columns'}로, 기본값은 0이다. 레이블을 인덱스(0 또는 'index')에서 제거할지, 열(1 또는 'columns')에서 제거할지를 결정한다.
  • index : 단일 레이블 또는 list-like 객체로, axis를 지정하는 대안이다. (labels, axis=0은 index=labels와 동일하게 동작한다.)
  • columns : 단일 레이블 또는 list-like 객체로, axis를 지정하는 또 다른 대안이다. (labels, axis=1은 columns=labels와 동일하게 동작한다.)
  • level : int 또는 레벨 이름으로 선택 사항이며, MultiIndex에서 특정 레벨의 레이블을 제거할 때 사용된다.
  • inplace : bool 타입으로, 기본값은 False이다. False일 경우, 복사본을 반환하며, True일 경우, 원본에서 직접 작업을 수행하고 None을 반환한다.
  • errors : {'ignore', 'raise'} 중 하나를 선택하며, 기본값은 'raise'이다. 'ignore'를 선택하면, 존재하는 레이블만 제거하고 오류를 무시한다.

pandas.DataFrame.drop()의 반환값을 보면 DataFrame 또는 None인 것을 확인할 수 있다. 이를 통해 기본적으로 inplace parameter default는 False이므로 따로 inplace 값을 True로 지정해주지 않는 이상 pandas.DataFrame.drop()는 원본 데이터를 변경하지 않는다. 

 

# 행 데이터 삭제 & inplace parameter 변경을 통해 원본 데이터 삭제 유무 확인

import pandas as pd 

# 실습 데이터 생성
score = { 'name' : ['Jessi', 'Emma', 'Alex', 'Jessi', 'Tom'],
          'age': [20, 24, 23, 20, 27],
          'score': [100, 95, 80, 85, 97], 
          'grade': ['A','A','B','B','A'],
          'subject':['python', 'java','python', 'c','java']}
          
score_df = pd.DataFrame(data=score)

score_df.loc[6] = ['Jina','20',100,'A','python']

print('\nAdd Row 6')
print(score_df)

new_df = score_df.drop(6)

print("\nCheck Original DataFrame change")
print(score_df)

score_df.drop(6,inplace =True)

print("\nCheck Original DataFrame change")
print(score_df)
Add Row 6
    name age  score grade subject
0  Jessi  20    100     A  python
1   Emma  24     95     A    java
2   Alex  23     80     B  python
3  Jessi  20     85     B       c
4    Tom  27     97     A    java
6   Jina  20    100     A  python

# inplace=False일 때 drop(6)을 통해 인덱스 6 행을 삭제하더라도 원본 데이터는 유지
Check Original DataFrame change
    name age  score grade subject
0  Jessi  20    100     A  python
1   Emma  24     95     A    java
2   Alex  23     80     B  python
3  Jessi  20     85     B       c
4    Tom  27     97     A    java
6   Jina  20    100     A  python

# inplace=True일 때 drop(6)을 통해 인덱스 6 행을 삭제하면 원본데이터에서 삭제됨을 확인 가능
Check Original DataFrame change
    name age  score grade subject
0  Jessi  20    100     A  python
1   Emma  24     95     A    java
2   Alex  23     80     B  python
3  Jessi  20     85     B       c
4    Tom  27     97     A    java

 

# 열 데이터 삭제

import pandas as pd 

# 실습 데이터 생성
score = { 'name' : ['Jessi', 'Emma', 'Alex', 'Jessi', 'Tom'],
          'age': [20, 24, 23, 20, 27],
          'score': [100, 95, 80, 85, 97], 
          'grade': ['A','A','B','B','A'],
          'subject':['python', 'java','python', 'c','java']}
          
score_df = pd.DataFrame(data=score)

score_df.loc[6] = ['Jina','20',100,'A','python']

print(score_df)

new_df = score_df.drop(columns=['grade'],inplace=True)

print("\nCheck Original DataFrame change")
print(score_df)
    name age  score grade subject
0  Jessi  20    100     A  python
1   Emma  24     95     A    java
2   Alex  23     80     B  python
3  Jessi  20     85     B       c
4    Tom  27     97     A    java
6   Jina  20    100     A  python

Check Original DataFrame change
    name age  score subject
0  Jessi  20    100  python
1   Emma  24     95    java
2   Alex  23     80  python
3  Jessi  20     85       c
4    Tom  27     97    java
6   Jina  20    100  python

 

결과를 살펴보면 grade 인덱스 명의 column이 삭제된 것을 볼 수 있다.