Back-End/Pandas

추가, 삽입, 삭제

pshoon25 2022. 12. 15. 01:31

👨🏻‍💻판다스(Pandas)의 데이터 프레임(Data Frame)에서 행(Row) 또는 열(Column)을 추가하거나, 삽입하거나, 삭제를 할 수 있다.

 

행과 열의 따라 각각의 추가, 삽입, 삭제에 대하여 세 가지로 나누어 알아보자 !


추가

Column

컬럼을 추가하는 문법은 세 가지가 있다.

  • df['컬럼명'] = 값
  • df.assign('컬럼명' = 리스트|함수)
  • pd.concat([df, df2], axis=1)

개인적으로 선호하는 함수는 df['컬럼명']= 과 pd.concat( ) 함수를 선호한다.

df['컬럼명'] 함수는 매우 간단하여 사용하기가 쉽고,

pd.concat( ) 함수는 열 추가와 같이 사용할 수 있다.

 

👉df['컬럼명'] = 값

import pandas as pd
import numpy as np

df = pd.DataFrame({'c1' : [1, 2, 3],
                   'c2' : [4, 5, 6]})
print(df)
'''
   c1  c2
0   1   4
1   2   5
2   3   6
'''
df['c3'] = [7, 8, 9]
print(df)
'''
   c1  c2  c3
0   1   4   7
1   2   5   8
2   3   6   9
'''
df['sum'] = df['c1'] + df['c2'] + df['c3']
print(df)
'''
   c1  c2  c3  sum
0   1   4   7   12
1   2   5   8   15
2   3   6   9   18
'''
df['avg'] = df['sum'] / 3
print(df)
'''
   c1  c2  c3  sum  avg
0   1   4   7   12  4.0
1   2   5   8   15  5.0
2   3   6   9   18  6.0
'''
df['bool'] = ['True' if avg >= 5 else 'False' for avg in df['avg']]
print(df) 
'''
   c1  c2  c3  sum  avg   bool
0   1   4   7   12  4.0  False
1   2   5   8   15  5.0   True
2   3   6   9   18  6.0   True
'''

df['컬럼명'] =  을 이용하여 컬럼을 추가할 경우,

원본 Data Frame 의 Series 들을 연산하여 사용할 수 있다.

보통 sum 이나 avg 등의 연산 컬럼을 추가할 때 사용한다.

추가로 조건문이나 반복문도 사용이 가능하다.

 

👉df.assign('컬럼명'= 값)

df.assign( ) 함수에서도 위와 같이 연산 및 조건문, 반복문이 사용 가능하다.

import pandas as pd
import numpy as np

df = pd.DataFrame({'c1' : [1, 2, 3],
                   'c2' : [4, 5, 6]})
print(df)
'''
   c1  c2
0   1   4
1   2   5
2   3   6
'''
df = df.assign(c3=[7, 8, 9])
print(df)
'''   c1  c2  c3
0   1   4   7
1   2   5   8
2   3   6   9
'''
df = df.assign(sum= lambda x : df['c1'] + df['c2'] + df['c3'])
print(df)
'''
   c1  c2  c3  sum
0   1   4   7   12
1   2   5   8   15
2   3   6   9   18
'''
df = df.assign(avg= df['sum'] / 4)
print(df)
'''
   c1  c2  c3  sum   avg
0   1   4   7   12  3.00
1   2   5   8   15  3.75
2   3   6   9   18  4.50
'''
df = df.assign(bool = [True if avg > 3.5 else False for avg in df['avg']])
print(df)
'''
   c1  c2  c3  sum   avg   bool
0   1   4   7   12  3.00  False
1   2   5   8   15  3.75   True
2   3   6   9   18  4.50   True
'''

 

👉pd.concat([df, df2], axis=1)

import pandas as pd
import numpy as np

df = pd.DataFrame({'c1' : [1, 2, 3],
                   'c2' : [4, 5, 6]})
print(df)
'''
   c1  c2
0   1   4
1   2   5
2   3   6
'''
df2 = pd.DataFrame({'c3' : [7, 8, 9]})
df = pd.concat([df, df2], axis=1)
print(df)
'''
   c1  c2  c3
0   1   4   7
1   2   5   8
2   3   6   9
'''

 

 

나는 개인적으로 concat 함수를 선호한다.

axis=0|1 값 지정으로 인하여 행과 열을 구분하여 생성할 수 있기 때문이다.


Row

행을 추가하는 함수는 두가지가 있다.

  • df.append(df2, ignore_index=True)
  • pd.concat([df, df2], axis=0)

행 추가 함수에서는 pd.concat( )함수를 적극 추천한다. 

그 이유는 아래에서 같이 설명하겠다.

 

👉df.append(df2, ignore_index=True)

import pandas as pd
import numpy as np

df = pd.DataFrame({'c1' : [24, 35, 56, 27, 18],
                   'c2' : [14, 15, 16, 17, 18],
                   'c3' : [24, 25, 26, 27, 28]})
df2 = pd.DataFrame({'c1' : [99, 85],
                   'c2' : [93, 77],
                   'c3' : [95, 96]})
df3 = pd.DataFrame({'c1' : [100, 100],
                   'c2' : [100, 100],
                   'c3' : [100, 100]})

new_df = df.append(df2)
print(new_df)
'''
   c1  c2  c3
0  24  14  24c1  35  15  25
2  56  16  26
3  27  17  27
4  18  18  28
0  99  93  95
1  85  77  96
'''
new_df = df.append([df2, df3])
print(new_df)
'''
    c1   c2   c3
0   24   14   24
1   35   15   25
2   56   16   26
3   27   17   27
4   18   18   28
0   99   93   95
1   85   77   96
0  100  100  100
1  100  100  100
'''
new_df = df.append([df2, df3], ignore_index=True)
print(new_df)
'''
    c1   c2   c3
0   24   14   24
1   35   15   25
2   56   16   26
3   27   17   27
4   18   18   28
5   99   93   95
6   85   77   96
7  100  100  100
8  100  100  100
'''

df.append(df2 ) 함수는 df라는 데이터 프레임에 df2 데이터 프레임을 추가할 수 있다.

2개 이상의 데이터 프레임을 추가할 수 있으며, 

ignore_index = 파라미터를 True값으로 주면 인덱스 번호 또한 연동시킨다.

 

다만, 출력시 위와 같은 경고가 발생한다.

FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.

해당 함수는 판다스의 이후 버전에서 지원을 안할 수 있으니, concat 함수를 사용하라고 안내해준다.

 

👉pd.concat([df, df2], axis=0)

import pandas as pd
import numpy as np

df = pd.DataFrame({'c1' : [24, 35, 56, 27, 18],
                   'c2' : [14, 15, 16, 17, 18],
                   'c3' : [24, 25, 26, 27, 28]})
df2 = pd.DataFrame({'c1' : [99, 85],
                   'c2' : [93, 77],
                   'c3' : [95, 96]})
df3 = pd.DataFrame({'c1' : [100, 100],
                   'c2' : [100, 100],
                   'c3' : [100, 100]})

new_df = pd.concat([df, df2], axis=0)
print(new_df)
'''
   c1  c2  c3
0  24  14  24
1  35  15  25
2  56  16  26
3  27  17  27
4  18  18  28
0  99  93  95
1  85  77  96
'''
new_df = pd.concat([df, df2, df3], axis=0, ignore_index=True)
print(new_df)
'''
    c1   c2   c3
0   24   14   24
1   35   15   25
2   56   16   26
3   27   17   27
4   18   18   28
5   99   93   95
6   85   77   96
7  100  100  100
8  100  100  100
'''

df.concat( ) 함수는 컬럼 생성에서 사용했던 것과 같이 사용할 수 있다.

단, 행에 추가를 할 경우 axis=0값으로 기재하면 된다.

ignore_index=True 값으로 지정할 경우 인덱스 값도 연동되어 반환해준다.


삽입

Column

행을 삽입 하는 함수는 아래와 같다.

 

👉df.insert(삽입할 컬럼 위치,컬럼명,값)

위치 ==> 컬럼이 삽입될 위치이며, 컬럼의 위치값의 '앞'에 삽입된다.

import pandas as pd
import numpy as np

df = pd.DataFrame({'c1' : [4, 5, 6, 7, 8],
                   'c2' : [14, 15, 16, 17, 18]})
print(df)
'''
   c1  c2
0   4  14
1   5  15
2   6  16
3   7  17
4   8  18
'''

df.insert(0, 'c3', [10, 20, 30, 40 , 50])
print(df)
'''
   c3  c1  c2
0  10   4  14
1  20   5  15
2  30   6  16
3  40   7  17
4  50   8  18
'''

df.insert(2, 'c3', [10, 20, 30, 40 , 50], allow_duplicates=True)        
# allow_duplicates=True 중복 삽입 허용
print(df)
'''
   c3  c1  c3  c2
0  10   4  10  14
1  20   5  20  15
2  30   6  30  16
3  40   7  40  17
4  50   8  50  18
'''

df.insert 함수는 컬럼명이 동일할 경우 중복 추가가 불가하다.

그럴 경우, 파라미터의 allow_duplicates=True로 기재하면 중복으로도 추가 삽입이 가능하다.


삭제

Column

 

행을 삭제하는 방법은 단일 삭제와 다중 삭제가 있다.

  • 단일 컬럼 삭제 : df.pop( )함수와 del df[ ]함수가 있다.
  • 다중 컬럼 삭제 : df.drop( ) 함수가 있다.

나는 df.drop( ) 함수를 선호한다.

다중 컬럼 삭제 함수인 df.drop( )를 사용하여 단일 컬럼도 삭제할 수 있으며,

axis=0|1 을 설정하여 행과 열의 삭제를 지정할 수 있기 때문이다.

 

단일 컬럼 삭제

👉df.pop('컬럼명') & del df['컬럼명']

import pandas as pd
import numpy as np

df = pd.DataFrame({'c1' : [24, 35, 56, 27, 18],
                   'c2' : [14, 15, 16, 17, 18],
                   'c3' : [24, 25, 26, 27, 28],
                   'c4' : [14, 25, 36, 47, 58]})
print(df)
'''
   c1  c2  c3  c4
0  24  14  24  14
1  35  15  25  25
2  56  16  26  36
3  27  17  27  47
4  18  18  28  58
'''

# 1. 단일 컬럼 삭제

## 가. df.pop('컬럼명')
df.pop('c6')     
print(df)
'''
   c1  c2  c4
0  24  14  14
1  35  15  25
2  56  16  36
3  27  17  47
4  18  18  58
'''

## 나. del df['컬럼명']
del df['c1']
print(df)
'''
   c2  c4
0  14  14
1  15  25
2  16  36
3  17  47
4  18  58
'''

입력한 값이 데이터 프레임 내 존재하지 않는 컬럼명일 경우 에러가 발생한다.

 

 

다중 컬럼 삭제

👉df.drop(columns=[컬럼명]) or df.drop(리스트, axis=1)

import pandas as pd
import numpy as np

df = pd.DataFrame({'c1' : [24, 35, 56, 27, 18],
                   'c2' : [14, 15, 16, 17, 18],
                   'c3' : [24, 25, 26, 27, 28],
                   'c4' : [14, 25, 36, 47, 58]})
print(df)
'''
   c1  c2  c3  c4
0  24  14  24  14
1  35  15  25  25
2  56  16  26  36
3  27  17  27  47
4  18  18  28  58
'''

## df.drop()

df = df.drop(columns='c1')
print(df)
'''
   c2  c3  c4
0  14  24  14
1  15  25  25
2  16  26  36
3  17  27  47
4  18  28  58
'''
df = df.drop(['c2', 'c4'], axis=1)
print(df)
'''
   c3
0  24
1  25
2  26
3  27
4  28
'''

df.drop()를 사용하는 방법은 두 가지이다.

  • columns= or index= 명을 직접 기입하여 삭제하는 방법
  • axis=0|1 을 기재하여 삭제하는 방법 : 컬럼을 삭제하기 때문에 axis=1값을 줬다.

 

Row

열을 삭제하는 함수는 df.drop( )함수이다.

단, 행과는 다르게 axis=0 값으로 지정하여야 한다.

 

👉df.drop(index=리스트) or df.drop(리스트, axis=0)

import pandas as pd
import numpy as np

df = pd.DataFrame({'c1' : [24, 35, 56, 27, 18],
                   'c2' : [14, 15, 16, 17, 18],
                   'c3' : [24, 25, 26, 27, 28],
                   'c4' : [14, 25, 36, 47, 58]}, index=list('ABCDE'))
print(df)
'''
   c1  c2  c3  c4
A  24  14  24  14
B  35  15  25  25
C  56  16  26  36
D  27  17  27  47
E  18  18  28  58
'''

## df.drop()

df = df.drop(index=['A', 'E'])
print(df)
'''
   c1  c2  c3  c4
B  35  15  25  25
C  56  16  26  36
D  27  17  27  47
'''
df = df.drop(['C', 'D'], axis=0)
print(df)
'''
   c1  c2  c3  c4
B  35  15  25  25
'''