26 분 소요

판다스 라이브러리를 통한 데이터전처리

Pandas는 파이썬에서 사용하는 데이터분석 라이브러리로, 행과 열로 이루어진 데이터 객체를 만들어 다룰 수 있게 되며 보다 안정적으로 대용량의 데이터들을 처리하는데 매우 편리한 도구 입니다.

데이터분석을 하는데 있어 판다스는 가장 기본적인 도구입니다.

이 포스팅에서는 판다스를 활용하여 할 수 있는 데이터 전처리에 대해서 다룹니다.

import pandas as pd


Dict를 통한 데이터 프레임 생성

pd.DataFrame({'a':[1,2,3],'b':[4,5,6]})

a b
0 1 4
1 2 5
2 3 6
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
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

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
df.columns = ['a','b','c']

df
a b c
0 1 4 7
1 2 5 8
2 3 6 9
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

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는 반영.
df
e 에프
0 1 4 7
1 2 5 8
2 3 6 9

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)
df1
x e f
0 1 4 7
1 2 5 8
2 3 6 9
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']
df2

x e f
0 1 4 7
1 2 5 8
2 3 6 9

Series

df = pd.DataFrame({'a' : [1,2,3],'b':[4,5,6],'c':[7,8,9]})
type(df['a'])
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
a['e']
2

유일한 값 찾기

df = pd.DataFrame({'a' : [1,2,3,1,2,3]})

a= df['a']

a.unique()[2] # set과 같은 DataFrame의 내장함수
3

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
df[['a','b']]
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

loc ( 원하는 행 추출)

df.loc[0]
---------------------------------------------------------------------------

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.iloc[:5,[1,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)]},index=index)
df.iloc[:5,[0,2]]
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
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
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
a=(df['a']>=3) & (df['b']<16)
df[a]

a b c
2 3 13 23
3 4 14 24
4 5 15 25

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

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
df.sort_index()
a b c
0 2 2 1
1 3 1 1
2 2 3 2
3 7 5 3
4 4 3 5
df.sort_index(ascending = False,inplace=True)
df
a b c
4 4 3 5
3 7 5 3
2 2 3 2
1 3 1 1
0 2 2 1
df.reset_index(inplace = True) # value 는 유지하고 인덱스만 원래순서로 바꾼다. inplace는 저장.
df.reset_index(drop=True,inplace=True) #초기화전 인덱스 값을 지워준다.
df
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

#값 기준 정렬

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
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
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

결측값 처리

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

결측 유무 확인

df.isnull()
a b c
0 False False False
1 False False False
2 False True False
3 False False False
4 False False False

결측값 개수 확인

df.isnull().sum() #count는 개수를 세는 것 , sum 0혹은 1이므로 개수를 세주는 효과.
a    0
b    1
c    0
dtype: int64

결측값이 포함된 행 지우기.

df.dropna(inplace =True)
df
a b c
0 1 2.0 3
1 1 3.0 4
3 4 3.0 6
4 5 4.0 4

결측값이 포함된 열 지우기

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

앞이나 뒤의 숫자로 바꾸기.

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
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

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

데이터 프레임에 존재하는 결측값들을 뒤의 값을 대체한 이후 앞의 값으로 대체하시오.

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
#평균으로 대체하기
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

타입 변환

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
df.dtypes
판매일     object
판매량     object
방문자수    object
기온      object
dtype: object

판매량을 정수 타입으로 변경

df=df.astype({'판매량' : 'int'})
df.dtypes
판매일     object
판매량      int64
방문자수    object
기온      object
dtype: object
df['판매량보정']= df['판매량'] + 1
df
판매일 판매량 방문자수 기온 판매량보정
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

방문자 수를 정수 타입으로 변경

#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
df.dtypes
판매일       object
판매량        int64
방문자수     float64
기온        object
판매량보정      int64
dtype: object
df
판매일 판매량 방문자수 기온 판매량보정
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
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

판매일을 datetime의 형태로 바꾸시오.

df['판매일'] = pd.to_datetime(df['판매일'],format='%m/%d/%y')
df.dtypes
판매일      datetime64[ns]
판매량               int64
방문자수              int64
기온               object
판매량보정             int64
dtype: object
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

레코드, 칼럼 추가 / 삭제

df = pd.DataFrame({'a' : [1,1,3,4,5],'b' : [2,3,2,3,4],'c':[3,4,7,6,4]})
df
a b c
0 1 2 3
1 1 3 4
2 3 2 7
3 4 3 6
4 5 4 4

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
df.dtypes
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

Column 삭제

df.drop(['d','e','f'],axis=1,inplace=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

레코드 추가 . 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
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

레코드 삭제





df
a b c
2 3 2 7
3 4 3 6
4 5 4 4
5 6 7 8
6 7 8 9
df=df.drop([2,3])

df
a b c
4 5 4 4
5 6 7 8
6 7 8 9
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
df.drop(df.index[:4])  #index가 문자열일 수도 있기 때문에 유용함.
a b c

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
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

apply, map을 활용한 데이터 변환

df = pd.DataFrame({'a':[1,2,3,4,5]})

a가 2보다 작으면 ‘2 미만’, 4보다 작으면 ‘4미만’ 4보다 크면 ‘4이상’이 저장된 b칼럼을 추가하시오.

df['b'] = 0

df
a b
0 1 0
1 2 0
2 3 0
3 4 0
4 5 0
a = df[df['a']<2]

a
a b
0 1 0
df['b'][a.index] = '2 미만'

df
a b
0 1 2 미만
1 2 0
2 3 0
3 4 0
4 5 0
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
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이상

함수 + 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이상

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

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

데이터 프레임 결합

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
  • 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
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]})
pd.concat([df1,df2])
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
  • 서로다른 필드로 구성되어 있는 데이터 프레임의 결합
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
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

좌우 결합

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]})
df1
A B C D
0 1 11 21 31
1 2 12 22 32
2 3 13 23 33
df2
E F G H
0 3 13 23 41
1 4 14 24 42
2 5 15 25 43
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

다음 두 데이터 프레임을 결합하시오.

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
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

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]})
df1
ID 성별 나이
0 1 F 20
1 2 M 30
2 3 F 40
3 4 M 25
4 5 F 42
df2
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
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
  • Left Join / INNER Join
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]})
df1

ID 성별 나이
0 1 F 20
1 2 M 30
2 3 F 40
3 4 M 25
4 5 F 42
df2
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

성별과 나이가 확인 된 유저들을 대상으로 키와 몸무게의 정보를 결합하시오.

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

키와 몸무게가 확인된 유저들을 대상으로 성별과 나이의 정보를 결합하시오.

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
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

키와 몸무게 성별 나이정보가 모두 확인된 유저들의 정보를 출력해라.

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

모든 유저들의 정보를 출력하시오.

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
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

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]})
df1
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
df1.dtypes
ID      int64
가입일    object
성별     object
dtype: object
df2
구매순서 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
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

그룹화

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

각회원의 누적 금액을 회원 ID별로 구하시오.

df2
구매순서 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
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

각 회원의 월별 누적 금액을 회원 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
df3 = pd.DataFrame(s2)

df3
금액
ID 구매월
1 1 2500
3 4000
2 2 2000
4 2 3000
df3.index
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
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
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

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]})
df
구매순서 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
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

각 회원의 최대사용금액과 최소 사용금액과 최저 수수료의 값을 구하라.

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
df2.columns.values
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

피벗테이블

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
pivot = pd.pivot_table(df,values = '탈퇴회원수',index=['가입월'],columns=['탈퇴월'])

type(pivot)
pandas.core.frame.DataFrame
pivot
탈퇴월 1 2 3
가입월
1 101.0 52.0 30.0
2 NaN 120.0 60.0
3 NaN NaN 130.0
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

어느 과일 매장의 판매내역이다. 각상품항목 별, 크기 별로 판매개수와 판매 금액의 합을 구하시오.

import random

random.randint(1,3)
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

df['금액']= df['품목'] * df['크기'] * 500

df['수수료'] = df['금액'] * 0.1
df
품목 크기 금액 수수료
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

fruit_name = {1: '토마토',2:'바나나',3:'사과'}
fruit_size = {1:'소',2:'중',3:'대'}

df['품목'] = df['품목'].map(fruit_name)

df['크기'] = df['크기'].map(fruit_size)


df
품목 크기 금액 수수료
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

df.dtypes
품목      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

각 상품항목별 크기 별로 판매개수와 판매금액 수수료의 합을 구하시오.

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

파일 호출 및 저장

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
구분자가 ‘ ‘인 경우.
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

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
df.columns
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

원하는 칼럼만 쓰고 싶을때

df = pd.read_csv('/content/drive/MyDrive/dataset/과일가게.csv',usecols=['품목','크기'])

df.head(4)
품목 크기
0 바나나
1 바나나
2 바나나
3 토마토

파일저장

df.to_csv('/content/drive/MyDrive/dataset/make_csv.csv')

카테고리:

업데이트:

댓글남기기