추가, 삽입, 삭제
👨🏻💻판다스(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
'''