판다스 라이브러리를 통한 데이터전처리
Pandas는 파이썬에서 사용하는 데이터분석 라이브러리로, 행과 열로 이루어진 데이터 객체를 만들어 다룰 수 있게 되며 보다 안정적으로 대용량의 데이터들을 처리하는데 매우 편리한 도구 입니다.
데이터분석을 하는데 있어 판다스는 가장 기본적인 도구입니다.
이 포스팅에서는 판다스를 활용하여 할 수 있는 데이터 전처리에 대해서 다룹니다.
Dict를 통한 데이터 프레임 생성
pd . DataFrame ({ 'a' :[ 1 , 2 , 3 ], 'b' :[ 4 , 5 , 6 ]})
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
df = pd . DataFrame ({ 'a' : [ 1 , 2 , 3 ], 'b' :[ 4 , 5 , 6 ], 'c' :[ 7 , 8 , 9 ]})
df
a
b
c
0
1
4
7
1
2
5
8
2
3
6
9
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
dum = { 'a' : [ 1 , 2 , 3 ], 'b' :[ 4 , 5 , 6 ], 'c' :[ 7 , 8 , 9 ]}
df = pd . DataFrame ( dum )
df
a
b
c
0
1
4
7
1
2
5
8
2
3
6
9
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
List를 활용한 DataFrame 생성
a = [[ 1 , 4 , 7 ],[ 2 , 5 , 8 ],[ 3 , 6 , 9 ]]
df = pd . DataFrame ( a )
df
0
1
2
0
1
4
7
1
2
5
8
2
3
6
9
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
df . columns = [ 'a' , 'b' , 'c' ]
df
a
b
c
0
1
4
7
1
2
5
8
2
3
6
9
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
import numpy as np
df = pd . DataFrame ({ 'company' : [ 'abc' , '회사' , 123 ], '직원수' :[ 400 , 10 , 6 ], '위치' :[ 'Seoul' , np . NaN , 'Busan' ]})
df
company
직원수
위치
0
abc
400
Seoul
1
회사
10
NaN
2
123
6
Busan
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
Column 추출
df = pd . DataFrame ({ 'a' : [ 1 , 2 , 3 ], 'b' :[ 4 , 5 , 6 ], 'c' :[ 7 , 8 , 9 ]})
df . columns = [ 'd' , 'e' , 'f' ]
df . columns
Index(['d', 'e', 'f'], dtype='object')
df . rename ( columns = { 'd' : '디' , 'f' : '에프' }, inplace = True ) # inplace는 반영.
디
e
에프
0
1
4
7
1
2
5
8
2
3
6
9
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
Copy를 이용한 데이터 복사
df = pd . DataFrame ({ 'a' : [ 1 , 2 , 3 ], 'b' :[ 4 , 5 , 6 ], 'c' :[ 7 , 8 , 9 ]})
df . columns = [ 'd' , 'e' , 'f' ]
df1 = df
df . rename ( columns = { 'd' : 'x' }, inplace = True )
x
e
f
0
1
4
7
1
2
5
8
2
3
6
9
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
import copy
df2 = copy . deepcopy ( df )
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-4-67dbf102b951> in <module>
1 import copy
2
----> 3 df2=copy.deepcopy(df)
NameError: name 'df' is not defined
df . columns = [ 'c' , 'd' , 'l' ]
x
e
f
0
1
4
7
1
2
5
8
2
3
6
9
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
Series
df = pd . DataFrame ({ 'a' : [ 1 , 2 , 3 ], 'b' :[ 4 , 5 , 6 ], 'c' :[ 7 , 8 , 9 ]})
pandas.core.series.Series
a = pd . Series ([ 1 , 2 , 3 , 1 , 2 , 3 ], index = [ 'a' , 'b' , 'c' , 'd' , 'e' , 'f' ])
a
a 1
b 2
c 3
d 1
e 2
f 3
dtype: int64
유일한 값 찾기
df = pd . DataFrame ({ 'a' : [ 1 , 2 , 3 , 1 , 2 , 3 ]})
a = df [ 'a' ]
a . unique ()[ 2 ] # set과 같은 DataFrame의 내장함수
loc , iloc를 원하는 위치의 데이터 추출
df = pd . DataFrame ({ 'a' : [ i for i in range ( 1 , 11 , 1 )], 'b' : [ i for i in range ( 11 , 21 )], 'c' : [ i for i in range ( 21 , 31 )]})
df
a
b
c
0
1
11
21
1
2
12
22
2
3
13
23
3
4
14
24
4
5
15
25
5
6
16
26
6
7
17
27
7
8
18
28
8
9
19
29
9
10
20
30
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
a
b
0
1
11
1
2
12
2
3
13
3
4
14
4
5
15
5
6
16
6
7
17
7
8
18
8
9
19
9
10
20
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
loc ( 원하는 행 추출)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-1-7eaf75073732> in <module>
----> 1 df.loc[0]
NameError: name 'df' is not defined
df . loc [ 2 : 4 ] # DataFrame의 슬라이싱은 마지막번호까지 포함.
df = pd . DataFrame ({ 'a' : [ i for i in range ( 1 , 11 , 1 )], 'b' : [ i for i in range ( 11 , 21 )], 'c' : [ i for i in range ( 21 , 31 )]})
df . loc [ 2 :,[ 'c' ]]
df = pd . DataFrame ({ 'a' : [ i for i in range ( 1 , 11 , 1 )], 'b' : [ i for i in range ( 11 , 21 )], 'c' : [ i for i in range ( 21 , 31 )]}, index = index )
index = [ 'a' , 'b' , 'c' , 'd' , 'e' , 'f' , 'g' , 'g' , 'h' , 'i' ]
df = pd . DataFrame ({ 'a' : [ i for i in range ( 1 , 11 , 1 )], 'b' : [ i for i in range ( 11 , 21 )], 'c' : [ i for i in range ( 21 , 31 )]}, index = index )
df . iloc [: 5 ,[ 0 , 2 ]]
조건에 맞는 데이터 추출
df = pd . DataFrame ({ 'a' : [ i for i in range ( 1 , 11 , 1 )], 'b' : [ i for i in range ( 11 , 21 )], 'c' : [ i for i in range ( 21 , 31 )]})
df [[ 'a' , 'c' ]]
a
c
0
1
21
1
2
22
2
3
23
3
4
24
4
5
25
5
6
26
6
7
27
7
8
28
8
9
29
9
10
30
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
df [ df [ 'a' ] >= 3 ][[ 'a' , 'c' ]]
a
c
2
3
23
3
4
24
4
5
25
5
6
26
6
7
27
7
8
28
8
9
29
9
10
30
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
df [( df [ 'a' ] >= 3 ) & ( df [ 'b' ] < 16 )][[ 'a' , 'b' , 'c' ]]
a
b
c
2
3
13
23
3
4
14
24
4
5
15
25
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
a = ( df [ 'a' ] >= 3 ) & ( df [ 'b' ] < 16 )
df [ a ]
a
b
c
2
3
13
23
3
4
14
24
4
5
15
25
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
a과 3이하 이거나, 7이상인 데이터를 출력해라.
a = ( df [ 'a' ] <= 3 ) | ( df [ 'a' ] >= 7 )
df [ a ]
a
b
c
0
1
11
21
1
2
12
22
2
3
13
23
6
7
17
27
7
8
18
28
8
9
19
29
9
10
20
30
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
Sorting
df = pd . DataFrame ({ 'a' : [ 2 , 3 , 2 , 7 , 4 ], 'b' :[ 2 , 1 , 3 , 5 , 3 ], 'c' :[ 1 , 1 , 2 , 3 , 5 ]})
df
a
b
c
0
2
2
1
1
3
1
1
2
2
3
2
3
7
5
3
4
4
3
5
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
a
b
c
0
2
2
1
1
3
1
1
2
2
3
2
3
7
5
3
4
4
3
5
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
df . sort_index ( ascending = False , inplace = True )
a
b
c
4
4
3
5
3
7
5
3
2
2
3
2
1
3
1
1
0
2
2
1
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
df . reset_index ( inplace = True ) # value 는 유지하고 인덱스만 원래순서로 바꾼다. inplace는 저장.
df . reset_index ( drop = True , inplace = True ) #초기화전 인덱스 값을 지워준다.
index
a
b
c
0
4
4
3
5
1
3
7
5
3
2
2
2
3
2
3
1
3
1
1
4
0
2
2
1
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
#값 기준 정렬
df = pd . DataFrame ({ 'a' : [ 2 , 3 , 2 , 7 , 4 ], 'b' :[ 2 , 1 , 3 , 5 , 3 ], 'c' :[ 1 , 1 , 2 , 3 , 5 ]})
# a열 기준으로 오름(내림)차순 정렬하시오.
df . sort_values ( by = [ 'a' ], inplace = True )
df . sort_values ( by = [ 'a' ], ascending = False , inplace = True )
df . sort_values ( by = [ 'a' , 'b' ], ascending = True , inplace = True )
#a열기준 오름차순 정렬 후 b열기준 내림차순 정렬.
a
b
c
0
2
2
1
2
2
3
2
1
3
1
1
4
4
3
5
3
7
5
3
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
df . sort_values ( by = [ 'a' , 'b' ], ascending = [ True , False ], inplace = True )
df
a
b
c
2
2
3
2
0
2
2
1
1
3
1
1
4
4
3
5
3
7
5
3
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
df . reset_index ( drop = True , inplace = True )
df
a
b
c
0
2
3
2
1
2
2
1
2
3
1
1
3
4
3
5
4
7
5
3
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
결측값 처리
df = pd . DataFrame ({ 'a' : [ 1 , 1 , 3 , 4 , 5 ], 'b' :[ 2 , 3 , np . nan , 3 , 4 ], 'c' :[ 3 , 4 , 7 , 6 , 4 ]})
df [ 'ㅠ' ]
a
b
c
0
1
2.0
3
1
1
3.0
4
2
3
NaN
7
3
4
3.0
6
4
5
4.0
4
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
결측 유무 확인
a
b
c
0
False
False
False
1
False
False
False
2
False
True
False
3
False
False
False
4
False
False
False
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
결측값 개수 확인
df . isnull (). sum () #count는 개수를 세는 것 , sum 0혹은 1이므로 개수를 세주는 효과.
결측값이 포함된 행 지우기.
a
b
c
0
1
2.0
3
1
1
3.0
4
3
4
3.0
6
4
5
4.0
4
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
결측값이 포함된 열 지우기
df = pd . DataFrame ({ 'a' : [ 1 , 1 , 3 , 4 , 5 ], 'b' :[ 2 , 3 , np . nan , 3 , 4 ], 'c' :[ 3 , 4 , 7 , 6 , 4 ]})
df . dropna ( axis = 1 , inplace = True ) # axis =0 은 행 1은 열
결측값을 다른 값으로 대체하기
df = pd . DataFrame ({ 'a' : [ 1 , 1 , 3 , 4 , 5 ], 'b' :[ 2 , 3 , np . nan , 3 , 4 ], 'c' :[ 3 , 4 , 7 , 6 , 4 ]})
df . fillna ( 0 , inplace = True )
df
a
b
c
0
1
2.0
3
1
1
3.0
4
2
3
0.0
7
3
4
3.0
6
4
5
4.0
4
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
앞이나 뒤의 숫자로 바꾸기.
df = pd . DataFrame ({ 'a' : [ 1 , 1 , 3 , 4 , np . nan ], 'b' :[ 2 , 3 , np . nan , np . nan , 4 ], 'c' :[ np . nan , 4 , 7 , 6 , 4 ]})
df
a
b
c
0
1.0
2.0
NaN
1
1.0
3.0
4.0
2
3.0
NaN
7.0
3
4.0
NaN
6.0
4
NaN
4.0
4.0
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
df . fillna ( method = 'bfill' ) # 뒤의값으로 채우기.
df . fillna ( method = 'ffill' ) # 앞의값으로 채우기.
df
a
b
c
0
1.0
2.0
NaN
1
1.0
3.0
4.0
2
3.0
3.0
7.0
3
4.0
3.0
6.0
4
4.0
4.0
4.0
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
limit 설정
df = pd . DataFrame ({ 'a' : [ 1 , 1 , 3 , 4 , np . nan ], 'b' :[ 2 , 3 , np . nan , np . nan , 4 ], 'c' :[ np . nan , 4 , 7 , 6 , 4 ]})
df . fillna ( method = 'ffill' , limit = 1 )
a
b
c
0
1.0
2.0
NaN
1
1.0
3.0
4.0
2
3.0
3.0
7.0
3
4.0
NaN
6.0
4
4.0
4.0
4.0
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
데이터 프레임에 존재하는 결측값들을 뒤의 값을 대체한 이후 앞의 값으로 대체하시오.
df . fillna ( method = 'bfill' , inplace = True )
df . fillna ( method = 'ffill' , inplace = True )
df
a
b
c
0
1.0
2.0
4.0
1
1.0
3.0
4.0
2
3.0
4.0
7.0
3
4.0
4.0
6.0
4
4.0
4.0
4.0
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
#평균으로 대체하기
df = pd . DataFrame ({ 'a' : [ 1 , 1 , 3 , 4 , np . nan ], 'b' :[ 2 , 3 , np . nan , np . nan , 4 ], 'c' :[ np . nan , 4 , 7 , 6 , 4 ]})
df . mean ()
df . fillna ( df . mean ()[[ 'a' , 'b' , 'c' ]])
a
b
c
0
1.00
2.0
5.25
1
1.00
3.0
4.00
2
3.00
3.0
7.00
3
4.00
3.0
6.00
4
2.25
4.0
4.00
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
타입 변환
df = pd . DataFrame ({ '판매일' : [ '5/11/21' , '5/12/21' , '5/13/21' , '5/14/21' , '5/15/21' ], '판매량' :[ '10' , '15' , '20' , '25' , '30' ],
'방문자수' : [ '10' , '-' , '17' , '23' , '25' ],
'기온' :[ '24.1' , '24.3' , '24.8' , '25' , '25.4' ]})
df
판매일
판매량
방문자수
기온
0
5/11/21
10
10
24.1
1
5/12/21
15
-
24.3
2
5/13/21
20
17
24.8
3
5/14/21
25
23
25
4
5/15/21
30
25
25.4
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
판매일 object
판매량 object
방문자수 object
기온 object
dtype: object
판매량을 정수 타입으로 변경
df = df . astype ({ '판매량' : 'int' })
판매일 object
판매량 int64
방문자수 object
기온 object
dtype: object
df [ '판매량보정' ] = df [ '판매량' ] + 1
판매일
판매량
방문자수
기온
판매량보정
0
5/11/21
10
NaN
24.1
11
1
5/12/21
15
NaN
24.3
16
2
5/13/21
20
NaN
24.8
21
3
5/14/21
25
NaN
25
26
4
5/15/21
30
NaN
25.4
31
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
방문자 수를 정수 타입으로 변경
#df.astype({'방문자수' : 'int'})
df [ '방문자수' ] = pd . to_numeric ( df [ '방문자수' ], errors = 'coerce' )
df
판매일
판매량
방문자수
기온
0
5/11/21
10
10.0
24.1
1
5/12/21
15
NaN
24.3
2
5/13/21
20
17.0
24.8
3
5/14/21
25
23.0
25
4
5/15/21
30
25.0
25.4
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
판매일 object
판매량 int64
방문자수 float64
기온 object
판매량보정 int64
dtype: object
판매일
판매량
방문자수
기온
판매량보정
0
5/11/21
10
NaN
24.1
11
1
5/12/21
15
NaN
24.3
16
2
5/13/21
20
NaN
24.8
21
3
5/14/21
25
NaN
25
26
4
5/15/21
30
NaN
25.4
31
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
df [ '방문자수' ]. fillna ( 0 , inplace = True )
df = df . astype ({ '방문자수' : 'int' })
df
판매일
판매량
방문자수
기온
판매량보정
0
2021-05-11
10
10
24.1
11
1
2021-05-12
15
0
24.3
16
2
2021-05-13
20
17
24.8
21
3
2021-05-14
25
23
25
26
4
2021-05-15
30
25
25.4
31
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
판매일을 datetime의 형태로 바꾸시오.
df [ '판매일' ] = pd . to_datetime ( df [ '판매일' ], format = '%m/%d/%y' )
판매일 datetime64[ns]
판매량 int64
방문자수 int64
기온 object
판매량보정 int64
dtype: object
판매일
판매량
방문자수
기온
판매량보정
0
2021-05-11
10
10
24.1
11
1
2021-05-12
15
0
24.3
16
2
2021-05-13
20
17
24.8
21
3
2021-05-14
25
23
25
26
4
2021-05-15
30
25
25.4
31
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
레코드, 칼럼 추가 / 삭제
df = pd . DataFrame ({ 'a' : [ 1 , 1 , 3 , 4 , 5 ], 'b' : [ 2 , 3 , 2 , 3 , 4 ], 'c' :[ 3 , 4 , 7 , 6 , 4 ]})
a
b
c
0
1
2
3
1
1
3
4
2
3
2
7
3
4
3
6
4
5
4
4
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
Column 추가
df [ 'd' ] = [ 1 , 3 , 6 , 4 , 8 ]
df [ 'e' ] = 1 #df['e'] = [1,1,1,1,1]
df
a
b
c
d
e
0
1
2
3
1
1
1
1
3
4
3
1
2
3
2
7
6
1
3
4
3
6
4
1
4
5
4
4
8
1
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
a int64
b int64
c int64
d int64
e int64
dtype: object
a + b - c의 결과로 이루어진 f 칼럼을 추가해라.
df [ 'f' ] = df [ 'a' ] + df [ 'b' ] - df [ 'c' ]
df
a
b
c
d
e
f
0
1
2
3
1
1
0
1
1
3
4
3
1
0
2
3
2
7
6
1
-2
3
4
3
6
4
1
1
4
5
4
4
8
1
5
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
Column 삭제
df . drop ([ 'd' , 'e' , 'f' ], axis = 1 , inplace = True )
a
b
c
0
1
2
3
1
1
3
4
2
3
2
7
3
4
3
6
4
5
4
4
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
레코드 추가 . a 6 b 7 c 8
df = df . append ({ 'a' : 6 , 'b' : 7 , 'c' : 8 }, ignore_index = True )
df
a
b
c
0
1
2
3
1
1
3
4
2
3
2
7
3
4
3
6
4
5
4
4
5
6
7
8
6
6
7
8
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
df . loc [ 6 ] = [ 7 , 8 , 9 ] # 행 인덱스 6번 자리에 값 넣기
df
a
b
c
0
1
2
3
1
1
3
4
2
3
2
7
3
4
3
6
4
5
4
4
5
6
7
8
6
7
8
9
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
레코드 삭제
a
b
c
2
3
2
7
3
4
3
6
4
5
4
4
5
6
7
8
6
7
8
9
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
a
b
c
4
5
4
4
5
6
7
8
6
7
8
9
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
df = pd . DataFrame ({ 'a' : [ 1 , 1 , 3 , 4 , 5 ], 'b' : [ 2 , 3 , 2 , 3 , 4 ], 'c' :[ 3 , 4 , 7 , 6 , 4 ]})
df . drop ([ i for i in range ( 0 , 3 , 1 )])
df
a
b
c
0
1
2
3
1
1
3
4
2
3
2
7
3
4
3
6
4
5
4
4
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
df . drop ( df . index [: 4 ]) #index가 문자열일 수도 있기 때문에 유용함.
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
a가 3미만이고, c가 4인 레코드를 삭제해라.
df = df . drop ( df [ df [ 'a' ] < 3 ]. index )
df
a
b
c
2
3
2
7
3
4
3
6
4
5
4
4
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
df = pd . DataFrame ({ 'a' : [ 1 , 1 , 3 , 4 , 5 ], 'b' : [ 2 , 3 , 2 , 3 , 4 ], 'c' :[ 3 , 4 , 7 , 6 , 4 ]})
df = df . drop ( df [( df [ 'a' ] < 3 ) & ( df [ 'c' ] == 4 )]. index )
df
a
b
c
0
1
2
3
2
3
2
7
3
4
3
6
4
5
4
4
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
apply, map을 활용한 데이터 변환
df = pd . DataFrame ({ 'a' :[ 1 , 2 , 3 , 4 , 5 ]})
a가 2보다 작으면 ‘2 미만’, 4보다 작으면 ‘4미만’ 4보다 크면 ‘4이상’이 저장된 b칼럼을 추가하시오.
a
b
0
1
0
1
2
0
2
3
0
3
4
0
4
5
0
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
df [ 'b' ][ a . index ] = '2 미만'
df
a
b
0
1
2 미만
1
2
0
2
3
0
3
4
0
4
5
0
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
a = df [( df [ 'a' ] >= 2 ) & ( df [ 'a' ] < 4 )]
df [ 'b' ][ a . index ] = '4미만'
/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:3: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
This is separate from the ipykernel package so we can avoid doing imports until
pd . set_option ( 'mode.chained_assignment' , None )
df [ 'b' ][ a . index ] = '4미만'
df
a
b
0
1
2 미만
1
2
4미만
2
3
4미만
3
4
0
4
5
0
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
a = df [ df [ 'a' ] >= 4 ]
df [ 'b' ][ a . index ] = '4이상'
df
a
b
0
1
2 미만
1
2
4미만
2
3
4미만
3
4
4이상
4
5
4이상
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
함수 + apply를 이용한 해결
def case_function ( x ):
if x < 2 :
return '2 미만'
elif x < 4 :
return '4미만'
else :
return '4이상'
df [ 'c' ] = df [ 'a' ]. apply ( case_function )
df
a
b
c
0
1
2 미만
2 미만
1
2
4미만
4미만
2
3
4미만
4미만
3
4
4이상
4이상
4
5
4이상
4이상
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
a가 1이면 ‘one’ , 2이면 ‘two’ 3이면 ‘three’ 4이면 ‘four’ 5이면 ‘five’를 출력하는 칼럼 d를 만드시오.
def case1 ( x ):
if x == 1 :
return 'one'
if x == 2 :
return 'two'
if x == 3 :
return 'three'
if x == 4 :
return 'four'
if x == 5 :
return 'five'
df [ 'd' ] = df [ 'a' ]. apply ( case1 )
df
a
b
c
d
0
1
2 미만
2 미만
one
1
2
4미만
4미만
two
2
3
4미만
4미만
three
3
4
4이상
4이상
four
4
5
4이상
4이상
five
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
map를 활용한 방법
a = { 1 : 'one' , 2 : 'two' , 3 : 'three' , 4 : 'four' , 5 : 'five' }
df [ 'e' ] = df [ 'a' ]. map ( a )
df
a
b
c
d
e
0
1
2 미만
2 미만
one
one
1
2
4미만
4미만
two
two
2
3
4미만
4미만
three
three
3
4
4이상
4이상
four
four
4
5
4이상
4이상
five
five
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
데이터 프레임 결합
df1 = pd . DataFrame ({ 'A' : [ 1 , 2 , 3 ], 'B' : [ 11 , 12 , 13 ], 'C' :[ 21 , 22 , 23 ]})
df2 = pd . DataFrame ({ 'A' : [ 4 , 5 , 6 ], 'B' :[ 14 , 15 , 16 ], 'C' :[ 24 , 25 , 26 ]})
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-1-8f7d7e617188> in <module>
----> 1 df1 = pd.DataFrame({'A' : [1,2,3],'B' : [11,12,13],'C':[21,22,23]})
2 df2 = pd.DataFrame({'A' : [4,5,6],'B' :[14,15,16],'C':[24,25,26]})
3
4
NameError: name 'pd' is not defined
#pd.concat([df1,df2])
pd . concat ([ df2 , df1 ])
A
B
C
0
4
14
24
1
5
15
25
2
6
16
26
0
1
11
21
1
2
12
22
2
3
13
23
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
index 초기화를 위해서는 ignore_index = True
pd . concat ([ df1 , df2 ], ignore_index = True )
A
B
C
0
1
11
21
1
2
12
22
2
3
13
23
3
4
14
24
4
5
15
25
5
6
16
26
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
df1 = pd . DataFrame ({ 'A' : [ 1 , 2 , 3 ], 'B' : [ 11 , 12 , 13 ], 'C' :[ 21 , 22 , 23 ]})
df2 = pd . DataFrame ({ 'B' :[ 14 , 15 , 16 ], 'A' : [ 4 , 5 , 6 ], 'C' :[ 24 , 25 , 26 ]})
A
B
C
0
1
11
21
1
2
12
22
2
3
13
23
0
4
14
24
1
5
15
25
2
6
16
26
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
서로다른 필드로 구성되어 있는 데이터 프레임의 결합
df1 = pd . DataFrame ({ 'A' : [ 1 , 2 , 3 ], 'B' : [ 11 , 12 , 13 ], 'C' :[ 21 , 22 , 23 ], 'D' :[ 31 , 32 , 33 ]})
df2 = pd . DataFrame ({ 'A' : [ 3 , 4 , 5 ], 'B' :[ 13 , 14 , 15 ], 'C' :[ 23 , 24 , 25 ], 'E' :[ 41 , 42 , 43 ]})
pd . concat ([ df1 , df2 ]) # join = 'outer' 와 동일하다.
A
B
C
D
E
0
1
11
21
31.0
NaN
1
2
12
22
32.0
NaN
2
3
13
23
33.0
NaN
0
3
13
23
NaN
41.0
1
4
14
24
NaN
42.0
2
5
15
25
NaN
43.0
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
pd . concat ([ df1 , df2 ], join = 'inner' )
A
B
C
0
1
11
21
1
2
12
22
2
3
13
23
0
3
13
23
1
4
14
24
2
5
15
25
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
좌우 결합
df1 = pd . DataFrame ({ 'A' :[ 1 , 2 , 3 ], 'B' :[ 11 , 12 , 13 ], 'C' :[ 21 , 22 , 23 ], 'D' :[ 31 , 32 , 33 ]})
df2 = pd . DataFrame ({ 'E' :[ 3 , 4 , 5 ], 'F' :[ 13 , 14 , 15 ], 'G' :[ 23 , 24 , 25 ], 'H' :[ 41 , 42 , 43 ]})
A
B
C
D
0
1
11
21
31
1
2
12
22
32
2
3
13
23
33
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
E
F
G
H
0
3
13
23
41
1
4
14
24
42
2
5
15
25
43
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
pd . concat ([ df1 , df2 ], axis = 1 )
A
B
C
D
E
F
G
H
0
1
11
21
31
3
13
23
41
1
2
12
22
32
4
14
24
42
2
3
13
23
33
5
15
25
43
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
다음 두 데이터 프레임을 결합하시오.
df1 = pd . DataFrame ({ 'ID' :[ 1 , 2 , 3 ], '성별' :[ 'F' , 'M' , 'F' ], '나이' :[ 20 , 30 , 40 ]})
df2 = pd . DataFrame ({ 'ID' :[ 1 , 2 , 3 ], '키' :[ 160.5 , 170.3 , 180.1 ], '몸무게' :[ 45.1 , 50.3 , 72.1 ]})
df2
ID
키
몸무게
0
1
160.5
45.1
1
2
170.3
50.3
2
3
180.1
72.1
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
pd . concat ([ df1 , df2 ], axis = 1 )
ID
성별
나이
ID
키
몸무게
0
1
F
20
1
160.5
45.1
1
2
M
30
2
170.3
50.3
2
3
F
40
3
180.1
72.1
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
ID를 기준으로 결합하시오.
df1 = pd . DataFrame ({ 'ID' :[ 1 , 2 , 3 , 4 , 5 ], '성별' :[ 'F' , 'M' , 'F' , 'M' , 'F' ], '나이' :[ 20 , 30 , 40 , 25 , 42 ]})
df2 = pd . DataFrame ({ 'ID' :[ 3 , 4 , 5 , 6 , 7 ], '키' :[ 160.5 , 170.3 , 180.1 , 142.3 , 153.7 ], '몸무게' :[ 45.1 , 50.3 , 72.1 , 38 , 42 ]})
ID
성별
나이
0
1
F
20
1
2
M
30
2
3
F
40
3
4
M
25
4
5
F
42
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
ID
키
몸무게
0
3
160.5
45.1
1
4
170.3
50.3
2
5
180.1
72.1
3
6
142.3
38.0
4
7
153.7
42.0
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
pd . concat ([ df1 , df2 ], axis = 1 )
ID
성별
나이
ID
키
몸무게
0
1
F
20
3
160.5
45.1
1
2
M
30
4
170.3
50.3
2
3
F
40
5
180.1
72.1
3
4
M
25
6
142.3
38.0
4
5
F
42
7
153.7
42.0
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
import pandas as pd
df1 = pd . DataFrame ({ 'ID' :[ 1 , 2 , 3 , 4 , 5 ], '성별' :[ 'F' , 'M' , 'F' , 'M' , 'F' ], '나이' :[ 20 , 30 , 40 , 25 , 42 ]})
df2 = pd . DataFrame ({ 'ID' :[ 3 , 4 , 5 , 6 , 7 ], '키' :[ 160.5 , 170.3 , 180.1 , 142.3 , 153.7 ], '몸무게' :[ 45.1 , 50.3 , 72.1 , 38 , 42 ]})
ID
성별
나이
0
1
F
20
1
2
M
30
2
3
F
40
3
4
M
25
4
5
F
42
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
ID
키
몸무게
0
3
160.5
45.1
1
4
170.3
50.3
2
5
180.1
72.1
3
6
142.3
38.0
4
7
153.7
42.0
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
성별과 나이가 확인 된 유저들을 대상으로 키와 몸무게의 정보를 결합하시오.
pd . merge ( df1 , df2 , how = 'left' , on = 'ID' )
ID
성별
나이
키
몸무게
0
1
F
20
NaN
NaN
1
2
M
30
NaN
NaN
2
3
F
40
160.5
45.1
3
4
M
25
170.3
50.3
4
5
F
42
180.1
72.1
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
키와 몸무게가 확인된 유저들을 대상으로 성별과 나이의 정보를 결합하시오.
pd . merge ( df2 , df1 , how = 'left' , on = 'ID' )
ID
키
몸무게
성별
나이
0
3
160.5
45.1
F
40.0
1
4
170.3
50.3
M
25.0
2
5
180.1
72.1
F
42.0
3
6
142.3
38.0
NaN
NaN
4
7
153.7
42.0
NaN
NaN
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
pd . merge ( df1 , df2 , how = 'right' , on = 'ID' )
ID
성별
나이
키
몸무게
0
3
F
40.0
160.5
45.1
1
4
M
25.0
170.3
50.3
2
5
F
42.0
180.1
72.1
3
6
NaN
NaN
142.3
38.0
4
7
NaN
NaN
153.7
42.0
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
키와 몸무게 성별 나이정보가 모두 확인된 유저들의 정보를 출력해라.
pd . merge ( df1 , df2 , how = 'inner' , on = 'ID' )
ID
성별
나이
키
몸무게
0
3
F
40
160.5
45.1
1
4
M
25
170.3
50.3
2
5
F
42
180.1
72.1
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
모든 유저들의 정보를 출력하시오.
pd . merge ( df1 , df2 , how = 'outer' , on = 'ID' )
ID
성별
나이
키
몸무게
0
1
F
20.0
NaN
NaN
1
2
M
30.0
NaN
NaN
2
3
F
40.0
160.5
45.1
3
4
M
25.0
170.3
50.3
4
5
F
42.0
180.1
72.1
5
6
NaN
NaN
142.3
38.0
6
7
NaN
NaN
153.7
42.0
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
df1 = pd . DataFrame ({ 'USER_ID' :[ 1 , 2 , 3 , 4 , 5 ], '성별' :[ 'F' , 'M' , 'F' , 'M' , 'F' ], '나이' :[ 20 , 30 , 40 , 25 , 42 ]})
df2 = pd . DataFrame ({ 'ID' :[ 3 , 4 , 5 , 6 , 7 ], '키' :[ 160.5 , 170.3 , 180.1 , 142.3 , 153.7 ], '몸무게' :[ 45.1 , 50.3 , 72.1 , 38 , 42 ]})
df3 = pd . merge ( df1 , df2 , how = 'outer' , left_on = 'USER_ID' , right_on = 'ID' )
df3 . rename ( columns = { 'USER_ID' : 'U_ID' })
U_ID
성별
나이
ID
키
몸무게
0
1.0
F
20.0
NaN
NaN
NaN
1
2.0
M
30.0
NaN
NaN
NaN
2
3.0
F
40.0
3.0
160.5
45.1
3
4.0
M
25.0
4.0
170.3
50.3
4
5.0
F
42.0
5.0
180.1
72.1
5
NaN
NaN
NaN
6.0
142.3
38.0
6
NaN
NaN
NaN
7.0
153.7
42.0
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
df1은 회원의 정보를 저장, df2는 각회원의 구매내역을 저장한 데이터프레임이다. 각회원의 정보와 구매내역을 취합하여 데이터프레임을 생성해라.
df1 = pd . DataFrame ({ 'ID' :[ 1 , 2 , 3 , 4 , 5 ], '가입일' : [ '2021-01-02' , '2021-01-04' , '2021-01-10' , '2021-02-10' , '2021-02-24' ], '성별' :[ 'F' , 'M' , 'F' , 'M' , 'M' ]})
df2 = pd . DataFrame ({ '구매순서' : [ 1 , 2 , 3 , 4 , 5 ], 'ID' :[ 1 , 1 , 2 , 4 , 1 ], '구매월' : [ 1 , 1 , 2 , 2 , 3 ], '금액' : [ 1000 , 1500 , 2000 , 3000 , 4000 ]})
ID
가입일
성별
0
1
2021-01-02
F
1
2
2021-01-04
M
2
3
2021-01-10
F
3
4
2021-02-10
M
4
5
2021-02-24
M
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
ID int64
가입일 object
성별 object
dtype: object
구매순서
ID
구매월
금액
0
1
1
1
1000
1
2
1
1
1500
2
3
2
2
2000
3
4
4
2
3000
4
5
1
3
4000
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
df4 = pd . merge ( df1 , df2 , how = 'left' , on = 'ID' )
df4
ID
가입일
성별
구매순서
구매월
금액
0
1
2021-01-02
F
1.0
1.0
1000.0
1
1
2021-01-02
F
2.0
1.0
1500.0
2
1
2021-01-02
F
5.0
3.0
4000.0
3
2
2021-01-04
M
3.0
2.0
2000.0
4
3
2021-01-10
F
NaN
NaN
NaN
5
4
2021-02-10
M
4.0
2.0
3000.0
6
5
2021-02-24
M
NaN
NaN
NaN
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
그룹화
df1 = pd . DataFrame ({ 'ID' :[ 1 , 2 , 3 , 4 , 5 ], '가입일' : [ '2021-01-02' , '2021-01-04' , '2021-01-10' , '2021-02-10' , '2021-02-24' ], '성별' :[ 'F' , 'M' , 'F' , 'M' , 'M' ]})
df2 = pd . DataFrame ({ '구매순서' : [ 1 , 2 , 3 , 4 , 5 ], 'ID' :[ 1 , 1 , 2 , 4 , 1 ], '구매월' : [ 1 , 1 , 2 , 2 , 3 ], '금액' : [ 1000 , 1500 , 2000 , 3000 , 4000 ]})
df1은 회원의 정보를 저장한 데이터플에ㅣㅁ, 각회원의 구매내역을 저장한 데이터프레임 : df2 각 회원의 정보와 구매내역을 취합하여 하나의 데이터 프레임으로 만드시오.
pd . merge ( df1 , df2 , how = 'left' , on = 'ID' )
ID
가입일
성별
구매순서
구매월
금액
0
1
2021-01-02
F
1.0
1.0
1000.0
1
1
2021-01-02
F
2.0
1.0
1500.0
2
1
2021-01-02
F
5.0
3.0
4000.0
3
2
2021-01-04
M
3.0
2.0
2000.0
4
3
2021-01-10
F
NaN
NaN
NaN
5
4
2021-02-10
M
4.0
2.0
3000.0
6
5
2021-02-24
M
NaN
NaN
NaN
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
각회원의 누적 금액을 회원 ID별로 구하시오.
구매순서
ID
구매월
금액
0
1
1
1
1000
1
2
1
1
1500
2
3
2
2
2000
3
4
4
2
3000
4
5
1
3
4000
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
df2 . groupby ( by = [ 'ID' ])[ '금액' ]. sum ()
ID
1 6500
2 2000
4 3000
Name: 금액, dtype: int64
type ( df2 . groupby ( by = [ 'ID' ])[ '금액' ]. sum ())
pandas.core.series.Series
s2 = df2 . groupby ( by = [ 'ID' ])[ '금액' ]. sum ()
pd . merge ( df1 , s2 , how = 'left' , on = 'ID' )
ID
가입일
성별
금액
0
1
2021-01-02
F
6500.0
1
2
2021-01-04
M
2000.0
2
3
2021-01-10
F
NaN
3
4
2021-02-10
M
3000.0
4
5
2021-02-24
M
NaN
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
각 회원의 월별 누적 금액을 회원 ID별로 추출하시오.
df2 . groupby ( by = [ 'ID' , '구매월' ])[ '금액' ]. sum ()
ID 구매월
1 1 2500
3 4000
2 2 2000
4 2 3000
Name: 금액, dtype: int64
s2 = df2 . groupby ( by = [ 'ID' , '구매월' ])[ '금액' ]. sum ()
pd . merge ( df1 , s2 , how = 'left' , on = 'ID' )
ID
가입일
성별
금액
0
1
2021-01-02
F
2500.0
1
1
2021-01-02
F
4000.0
2
2
2021-01-04
M
2000.0
3
3
2021-01-10
F
NaN
4
4
2021-02-10
M
3000.0
5
5
2021-02-24
M
NaN
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
df3 = pd . DataFrame ( s2 )
df3
금액
ID
구매월
1
1
2500
3
4000
2
2
2000
4
2
3000
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
MultiIndex([(1, 1),
(1, 3),
(2, 2),
(4, 2)],
names=['ID', '구매월'])
pd . merge ( df1 , df3 , how = 'left' , on = 'ID' )
ID
가입일
성별
금액
0
1
2021-01-02
F
2500.0
1
1
2021-01-02
F
4000.0
2
2
2021-01-04
M
2000.0
3
3
2021-01-10
F
NaN
4
4
2021-02-10
M
3000.0
5
5
2021-02-24
M
NaN
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
df2 . groupby ( by = [ 'ID' , '구매월' ], as_index = False )[ '금액' ]. sum ()
ID
구매월
금액
0
1
1
2500
1
1
3
4000
2
2
2
2000
3
4
2
3000
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
df3 = df2 . groupby ( by = [ 'ID' , '구매월' ], as_index = False )[ '금액' ]. sum ()
df4 = pd . merge ( df1 , df3 , how = 'left' , on = 'ID' )
df4 [ '금액' ] = df4 [ '금액' ]. fillna ( 0 )
df4 [ '구매월' ] = df4 [ '구매월' ]. fillna ( 1 )
df4 [[ '금액' , '구매월' ]] = df4 [[ '금액' , '구매월' ]]. astype ({ '금액' : 'int' , '구매월' :
'int' })
df4
ID
가입일
성별
구매월
금액
0
1
2021-01-02
F
1
2500
1
1
2021-01-02
F
3
4000
2
2
2021-01-04
M
2
2000
3
3
2021-01-10
F
1
0
4
4
2021-02-10
M
2
3000
5
5
2021-02-24
M
1
0
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
df는 각회원의 구매내역을 저장한 데이터프레임이다. 각회원의 누적금애과 누적 구매횟수를 회원 ID별로 구하시오.
df = pd . DataFrame ({ '구매순서' : [ 1 , 2 , 3 , 4 , 5 ], 'ID' : [ 1 , 1 , 2 , 4 , 1 ], '구매월' : [ 1 , 1 , 2 , 2 , 3 ], '금액' :[ 1000 , 1500 , 2000 , 3000 , 4000 ], '수수료' : [ 100 , 150 , 200 , 300 , 400 ]})
구매순서
ID
구매월
금액
수수료
0
1
1
1
1000
100
1
2
1
1
1500
150
2
3
2
2
2000
200
3
4
4
2
3000
300
4
5
1
3
4000
400
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
df2 = df . groupby ( by = [ 'ID' ])[ '금액' ]. agg ([ sum , len ]) # agg와 as_index는 같이 쓰면 작동 x
df2 . reset_index ( inplace = True )
df2
index
ID
sum
len
0
0
1
6500
3
1
1
2
2000
1
2
2
4
3000
1
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
각 회원의 최대사용금액과 최소 사용금액과 최저 수수료의 값을 구하라.
df2 = df . groupby ( by = [ 'ID' ]). agg ({ '금액' : [ max , min ], '수수료' : min })
df2 . reset_index ( inplace = True
)
df2
ID
금액
수수료
max
min
min
0
1
4000
1000
100
1
2
2000
2000
200
2
4
3000
3000
300
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
array([('ID', ''), ('금액', 'max'), ('금액', 'min'), ('수수료', 'min')],
dtype=object)
df2 . columns = [ '_' . join ( col ) for col in df2 . columns . values ]
df2
I_______D________
금_______액_______________m_______a_______x
금_______액_______________m_______i_______n
수_______수_______료_______________m_______i_______n
0
1
4000
1000
100
1
2
2000
2000
200
2
4
3000
3000
300
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
피벗테이블
A서비스의 월별 탈퇴 회원수를 가입 월별로 분류해놓은것이다. 이데이터 프레임을 이용하여 피벗테이블을 만드시오.
df = pd . DataFrame ({ '가입월' : [ 1 , 1 , 1 , 2 , 2 , 3 ], '탈퇴월' : [ 1 , 2 , 3 , 2 , 3 , 3 ], '탈퇴회원수' : [ 101 , 52 , 30 , 120 , 60 , 130 ]})
df
가입월
탈퇴월
탈퇴회원수
0
1
1
101
1
1
2
52
2
1
3
30
3
2
2
120
4
2
3
60
5
3
3
130
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
pivot = pd . pivot_table ( df , values = '탈퇴회원수' , index = [ '가입월' ], columns = [ '탈퇴월' ])
type ( pivot )
pandas.core.frame.DataFrame
탈퇴월
1
2
3
가입월
1
101.0
52.0
30.0
2
NaN
120.0
60.0
3
NaN
NaN
130.0
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
pivot = pd . pivot_table ( df , values = '탈퇴회원수' , index = [ '가입월' ], columns = [ '탈퇴월' ], fill_value = 0 )
pivot
탈퇴월
1
2
3
가입월
1
101
52
30
2
0
120
60
3
0
0
130
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
어느 과일 매장의 판매내역이다. 각상품항목 별, 크기 별로 판매개수와 판매 금액의 합을 구하시오.
import random
random . randint ( 1 , 3 )
a = []
b = []
for i in range ( 100 ):
a . append ( random . randint ( 1 , 3 ))
b . append ( random . randint ( 1 , 3 ))
df = pd . DataFrame ({ '품목' : a , '크기' : b })
df
품목
크기
0
1
1
1
3
3
2
3
1
3
3
1
4
2
3
...
...
...
95
2
2
96
3
3
97
2
3
98
3
2
99
1
1
100 rows × 2 columns
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
df [ '금액' ] = df [ '품목' ] * df [ '크기' ] * 500
df [ '수수료' ] = df [ '금액' ] * 0.1
품목
크기
금액
수수료
0
1
1
500
50.0
1
3
3
4500
450.0
2
3
1
1500
150.0
3
3
1
1500
150.0
4
2
3
3000
300.0
...
...
...
...
...
95
2
2
2000
200.0
96
3
3
4500
450.0
97
2
3
3000
300.0
98
3
2
3000
300.0
99
1
1
500
50.0
100 rows × 4 columns
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
fruit_name = { 1 : '토마토' , 2 : '바나나' , 3 : '사과' }
fruit_size = { 1 : '소' , 2 : '중' , 3 : '대' }
df [ '품목' ] = df [ '품목' ]. map ( fruit_name )
df [ '크기' ] = df [ '크기' ]. map ( fruit_size )
품목
크기
금액
수수료
0
토마토
소
500
50.0
1
사과
대
4500
450.0
2
사과
소
1500
150.0
3
사과
소
1500
150.0
4
바나나
대
3000
300.0
...
...
...
...
...
95
바나나
중
2000
200.0
96
사과
대
4500
450.0
97
바나나
대
3000
300.0
98
사과
중
3000
300.0
99
토마토
소
500
50.0
100 rows × 4 columns
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
품목 object
크기 object
금액 int64
수수료 float64
dtype: object
pivot = pd . pivot_table ( df , values = '금액' , index = [ '품목' ], columns = [ '크기' ], aggfunc = ( 'count' , 'sum' ))
pivot
count
sum
크기
대
소
중
대
소
중
품목
바나나
12
13
13
36000
13000
26000
사과
11
5
11
49500
7500
33000
토마토
9
17
9
13500
8500
9000
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
각 상품항목별 크기 별로 판매개수와 판매금액 수수료의 합을 구하시오.
pivot = pd . pivot_table ( df , index = [ '품목' ], columns = [ '크기' ], aggfunc = { '금액' :[ 'count' , 'sum' ], '수수료' :[ 'sum' ]})
pivot
금액
수수료
count
sum
sum
크기
대
소
중
대
소
중
대
소
중
품목
바나나
12
13
13
36000
13000
26000
3600.0
1300.0
2600.0
사과
11
5
11
49500
7500
33000
4950.0
750.0
3300.0
토마토
9
17
9
13500
8500
9000
1350.0
850.0
900.0
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
파일 호출 및 저장
df = pd . read_csv (
'/content/drive/MyDrive/dataset/과일가게.csv' , index_col = 0 ) # 첫번째 열을 인덱스로 만들기.
df . head ( 12 )
품목
크기
금액
수수료
0
바나나
중
2000
200.0
1
바나나
대
3000
300.0
2
바나나
중
2000
200.0
3
토마토
대
1500
150.0
4
토마토
소
500
50.0
5
바나나
중
2000
200.0
6
바나나
소
1000
100.0
7
사과
중
3000
300.0
8
바나나
중
2000
200.0
9
토마토
소
500
50.0
10
토마토
중
1000
100.0
11
바나나
소
1000
100.0
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
df = pd . read_csv ( '/content/drive/MyDrive/dataset/read_sep.txt' , index_col = 0 , sep = '|' )
df . head ()
A
B
C
index
0
1
11
21
1
2
12
22
2
3
13
23
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
header가 여러줄인경우
df = pd . read_csv ( '/content/drive/MyDrive/dataset/read_multi_header.csv' , header = 1 )
df
a
b
c
0
1
11
21
1
2
12
22
2
3
13
23
3
4
14
24
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
Index(['a', ' b', ' c'], dtype='object')
데이터를 읽으면서 칼럼명을 추가하고 싶을때
df = pd . read_csv ( '/content/drive/MyDrive/dataset/make_column_name.csv' , index_col = 0 , names = [ '품목' , '크기' , '금액' , '수수료' ])
df . head ( 5 )
품목
크기
금액
수수료
0
바나나
중
2000
200.0
1
바나나
대
3000
300.0
2
바나나
중
2000
200.0
3
토마토
대
1500
150.0
4
토마토
소
500
50.0
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
원하는 칼럼만 쓰고 싶을때
df = pd . read_csv ( '/content/drive/MyDrive/dataset/과일가게.csv' , usecols = [ '품목' , '크기' ])
df . head ( 4 )
품목
크기
0
바나나
중
1
바나나
대
2
바나나
중
3
토마토
대
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
파일저장
df . to_csv ( '/content/drive/MyDrive/dataset/make_csv.csv' )
댓글남기기