본문 바로가기
Python/Data Analysis

Pandas(DataFrame)

by emilia park 2023. 5. 16.
728x90

 

1. pandas 불러오기

import pandas as pd

 

2. pd.read_csv("data.csv") 

df_ins = pd.read_csv("insurance.csv")
print(df_ins.shape)  	#data size
df_ins.head(10)			#top 10 data print(default = 5)

 

3. dataframe column indexing 

#dataframe column 
df_ins.columns

#column select(1-column) 
df_ins['age']

#column select(multi-column) 
df_ins[['age', 'smoker','charges']]

 

 

 

연습1) PulseRates.csv data

import pandas as pd 
df_pr = pd.read_csv("PulseRates.csv")
print(df_pr.shape)
df_pr.head()

 

 

 

4. dataframe + condition

#dataframe with condition 
df_ins['age']<30 			#True&False bool type
df_ins[df_ins['age']<30]	#조건에 해당하는 데이터 추출
#dataframe with condition 
df_ins_male = df_ins[df_ins['sex'] == 'male']
df_ins_male

 

연습2) 

[실습] 데이터 불러오기 및 부분 선택

  1. data폴더에서 StudentsPerformance.csv를 불러와서 df_sp로 저장하기
  2. df_sp에서 math score, reading score, writing score 세 변수 선택하기
  3. df_sp에서 math score가 90이상인 데이터 선택하기
  4. df_sp에서 gender가 'female'인 데이터 선택하기
# 1. 데이터 불러오기 
import pandas as pd
df_sp = pd.read_csv('StudentsPerformance.csv')
print(df_sp.head())
df_sp.columns


# 2. 세 변수 선택하기 
df_sp[['math score', 'reading score', 'writing score']]


# 3. math score 90 이상 선택하기 
df_sp[df_sp['math score'] > 90]


# 4. 'female' 데이터 선택하기 
df_sp[df_sp['gender']=='female']

 

 

5. DataFrame 과 Series 이해 

Series)

- 일종의 리스트로 정수, 문자열, 실수 등 포함하는 1차원 배열

- 0~n의 인덱스를 가지는 리스트

- 인덱스와 함께 한 개의 리스트만 갖음

- DataFrame의 단일컬럼에 대한 데이터 구조 

 

DataFrame) 

- 메모리에 Series 데이터들로 저장이 됨

- 2차원 배열로 된 데이터 구조로 서로다른 데이터 타입을 컬럼에 저장

 

#Series 생성

from pandas import Series
import pandas as pd 

data = {'cake' : 5000, 'choco' : 1000, 'cheese' : 2000}
obj = Series(data) 
print(obj) 
print(type(obj))

#Series 생성

tup_data = ('emilia','1997-07-30','female',False)
series_data = pd.Series(tup_data, index = ['name','birth','sex','student'])
print(series_data)

 

#DataFrame 생성

import pandas as pd 

menu = ['cake' , 'choco', 'cheese']
price = [5000,1000,2000]

menu_series = pd.Series(menu) 
price_series = pd.Series(price) 

frame = {'Menu' : menu_series, 'Price' : price_series}

result = pd.DataFrame(frame) 
print(result) 
print(type(result))
print(result.dtypes)

df.dtypes : dataframe 의 column별 데이터 형태를 알려줌

#DataFrame 생성

import pandas as pd

dict_data = {'A':[1,2,3],'B':[4,5,6],'C':[7,8,9],'D':[10,11,12]}
df = pd.DataFrame(dict_data)

print(type(df))
print(df)

 

 

6. Data type 변환 (dtypes, set_index, reset_index, astype)

#DataFrame 생성

import pandas as pd 

menu = ['cake' , 'choco', 'cheese']
price = [5000,1000,2000]
kcal = [500, 300, 100]
sugar = [50, 20, 0]

menu_series = pd.Series(menu) 
price_series = pd.Series(price) 
kcal_series = pd.Series(kcal)
sugar_series = pd.Series(sugar) 

frame = {'Menu' : menu_series, 'Price' : price_series, 'Kcal' : kcal_series, 
         'Sugar' : sugar_series}

result = pd.DataFrame(frame) 
print(result) 
print(type(result))
print(result.dtypes)
result.astype(float)
#Menu column 의 data들을  float 형태로 나타낼 수 없어서 에러 발생
result.set_index('Menu', inplace = True)
result = result.astype(float) 
result.reset_index(inplace = True) 
result

Menu column 을 index 처리 한 상태에서 모든 데이터를 float 형태로 변환

result = result.astype({'Price':int})
result

price column 은 integer로 변경

df.astype({column name : data type}) : 원하는 컬럼만 선택해서 데이터 변환 가능

 

 

 

7. column rename 

df.rename(columns = {column name1 : column name2}, inplace = True) : name1 에서 name2 로 변경

inplace = True 가 되어있어야지 변경됨

 

import pandas as pd

dict_data = {'A':[1,2,3],'B':[4,5,6],'C':[7,8,9],'D':[10,11,12]}
df = pd.DataFrame(dict_data)

print(df) 
df.rename(columns = {'A' : 'a', 'B' : 'b'}, inplace = True)
print('\n')
print(df)

 

column name 변경

 

 

import pandas as pd

dict_data = {'A':[1,2,3],'B':[4,5,6],'C':[7,8,9],'D':[10,11,12]}
df = pd.DataFrame(dict_data)

print(df) 
df.rename(columns = lambda x: 'col_'+x , inplace = True)
print('\n')
print(df)

lambda x 를 써서 모든 column name을 한 번에 변경 가능

 

 

 

7. 행, 열 삭제 : dropna, duplicates, drop

dropna : 결측 데이터 제거 

drop.duplicates : 중복 제거

 

df.isnull() : 결측치가 있는지 확인. 있으면 True 반환 

df.isnull().sum() : 결측치 갯수 counting 

df = df.dropna() : 결측치가 있는 행 삭제 (df.dropna(inplace = True), 새로 선언 안해줘도 됨)

*dropna(how = 'all') : 해당 행의 데이터가 모두 결측치일때 제거

*dropna(thresh = 2) : 해당 행의 결측치가 2개 이상인 행만 제거

*dropna(axis = 1) : 결측치가 있는 열 삭제(디폴트는 행 삭제)

*dropna(how = 'all', axis = 1) : 해당 열의 데이터가 모두 결측치일때 제거 

df.duplicated().sum() : 중복된 행의 갯수 counting

df = df.drop_duplicates() : 중복된 행 삭제 (df.drop_duplicates(inplace = True), 새로 선언 안해줘도 됨) 

df = df.drop([index name]) : 해당 행 삭제 

 

+) 열 조건에 따라 행 삭제 : 조건에 해당하는 인덱스 가져와서 해당 데이터 행 삭제 

# delete column by condition 

import pandas as pd

dict_data = {'A':[1,2,3,4,5],'B':[4,5,6,7,8],
				'C':[7,8,9,10,11],'D':[10,11,12,13,14]}
df = pd.DataFrame(dict_data)

print(df)
print('\n')

idx_nm = df[df['C'] >=10].index
result = df.drop(idx_nm)
print(result)

#dropna 열삭제
import numpy as np 
import pandas as pd

dict_data = {'A':[1,2,3,4,5],'B':[4,5,6, np.nan, 'NaN'],
             'C':[7,8,9,10,11],'D':[10,11,12,13,14]}
df = pd.DataFrame(dict_data)

print(df)
print('\n')

df.dropna(axis = 1, inplace = True)
print(df)

*np.nan : 결측값 임의 생성 

결측값은 data analysis 에서 중요한 부분이다. 

결측값 부분은 다른 글에서 따로 정리하도록 하려 한다.

(결측값 제거, 결측값 변경 등)

 

 

 

 

8. 행, 열 추가 

 

- 행 추가

데이터 행 추가 방식에는 append(), loc[] 방식이 있는데 loc[] 방식이 좀 더 편한 방법인 것 같다.

 

append 방식) 

ignore_index = True 설정 필요 : 기존의 인덱스를 무시한다는 선언

# 행 추가 - append
import pandas as pd

dict_data = {'A':[1,2,3,4,5],'B':[4,5,6,7,8],
             'C':[7,8,9,10,11],'D':[10,11,12,13,14]}
df = pd.DataFrame(dict_data)

print(df) 

new_data = {'A':6, 'B':9, 'C':12, 'D':15}
df = df.append(new_data, ignore_index = True) 
print(df)

 

 

loc 방식) 

*loc : 변수명(컬럼이름, 인덱스 이름)을 사용, 정확한 이름 입력 필요

*iloc : 인덱스 번호 사용 

#행 추가 - loc[]
exam_data = {'name':['A','B','C']
             ,'math':[90,80,70], 'eng':[98,89,95],
            'writing':[85,95,100], 'listening':[100,90,90]}
df = pd.DataFrame(exam_data)
df.loc[3] = 'Null' 
df.loc[4] = ['D', 100,100,100,100]
df

 

 

- 열 추가

#열 추가
exam_data = {'name':['A','B','C']
             ,'math':[90,80,70], 'eng':[98,89,95],
            'writing':[85,95,100], 'listening':[100,90,90]}
df = pd.DataFrame(exam_data)
df['reading'] = [80, 90, 70]
df

 

 

9. 전치 : df.transpose(), df.T

#transpose

exam_data = {'name':['A','B','C']
             ,'math':[90,80,70], 'eng':[98,89,95],
            'writing':[85,95,100], 'listening':[100,90,90]}
df = pd.DataFrame(exam_data)
print(df) 
print('\n')

df = df.transpose() 
print(df) 

#df = df.T

 

 

10. apply 함수 사용 

- 특정 열과 행에 함수 적용 

import numpy as np 
import pandas as pd

np.random.seed(10)
n = 5
df = pd.DataFrame()
df['A'] = np.random.rand(n) ## random sample from standard uniform distribution
df['B'] = np.random.randn(n) ## random sample from standard normal distribution
df['C'] = np.linspace(0,5,n)

print(df) 
print('\n')

#column끼리의 합
df.apply(np.sum, axis = 0)

import numpy as np 
import pandas as pd

np.random.seed(10)
n = 5
df = pd.DataFrame()
df['A'] = np.random.rand(n) ## random sample from standard uniform distribution
df['B'] = np.random.randn(n) ## random sample from standard normal distribution
df['C'] = np.linspace(0,5,n)

print(df) 
print('\n')

# column 'A','B' 에만 square 함수 적용
print(df.apply(lambda x: np.square(x) if x.name in ['A','B'] else x))
print('\n')

# index 가 짝수인 행에만 square 함수 적용
print(df.apply(lambda x: np.square(x) if (x.name+1)%2 == 0 else x, axis = 1))

 

- 인자를 받는 함수 적용(argument 활용)

import numpy as np 
import pandas as pd

np.random.seed(10)
n = 5
df = pd.DataFrame()
df['A'] = np.random.rand(n) ## random sample from standard uniform distribution
df['B'] = np.random.randn(n) ## random sample from standard normal distribution
df['C'] = np.linspace(0,5,n)

print(df) 
print('\n')

# argument 활용하여 함수 적용
def col_sum(x,a,b): 
	return a*x + b
   
df.apply(col_sum, args = (3,1))


#같은 결과 출력코드1 
arg_dict = {'a':3, 'b':1}
df.apply(col_sum, **arg_dict) 


#같은 결과 출력코드2
df.apply(lambda x: col_sum(x,3,1))

 

 

- 특정조건에 맞는 행에 함수 적용 

import numpy as np 
import pandas as pd

np.random.seed(10)
n = 5
df = pd.DataFrame()
df['A'] = np.random.rand(n) ## random sample from standard uniform distribution
df['B'] = np.random.randn(n) ## random sample from standard normal distribution
df['C'] = np.linspace(0,5,n)

print(df) 
print('\n')

#특정조건에 해당하는 데이터에만 함수 적용
df.apply(lambda x:(np.square(x['A']), np.log(x['B']), x['C']) 
          if x['B']>0 else x, axis =1)

 

 

 

11. 데이터 병합 : concat, merge

 

[concat] 

pd.concat([df1,df2,df3]) : 기본 옵션, 열방향 병합

pd.concat([df1,df2,df3], axis = 1) : 행방향 병합, outer join

pd.concat([df1,df2], axis = 1, join = 'inner') : 행방향 병합, inner join

pd.concat([df1,df2], axis = 1, join_axes = [df1.index])  : 행방향 병합, outer join, df1의 index는 살림

pd.concat([[df1,df2], ignore_index = True) : 기존 index 무시하고 다시 index 부여 

import pandas as pd

df1 = pd.DataFrame([['A0', 'A1', 'A2', 'A3'],
                     ['B0', 'B1', 'B2', 'B3'],
                     ['C0', 'C1', 'C2', 'C3'],
                     ['D0', 'D1', 'D2', 'D3']], columns=list('ABCD'))
df2 = pd.DataFrame([['A4', 'A5', 'A6', 'A7'],
                     ['B4', 'B5', 'B6', 'B7'],
                     ['C4', 'C5', 'C6', 'C7'],
                     ['D4', 'D5', 'D6', 'D7']], columns=['A', 'B', 'C', 'D'], index=[4, 5, 6, 7])

df3 = pd.DataFrame([['A8', 'A9', 'A10', 'A11'],
                     ['B8', 'B9', 'B10', 'B11'],
                     ['C8', 'C9', 'C10', 'C11'],
                     ['D8', 'D9', 'D10', 'D11']], columns=list('ABCD'), index=[8, 9, 10, 11])

print(df1)
print(df2)
print(df3)
#열방향 병합
print(pd.concat([df1, df2, df3]))

#행방향 병합 : 결측치 발생 
print(pd.concat([df1, df2, df3], axis = 1))

column concat
index concat

 

 

import pandas as pd

df1 = pd.DataFrame([['A0', 'A1', 'A2', 'A3'],
                     ['B0', 'B1', 'B2', 'B3'],
                     ['C0', 'C1', 'C2', 'C3'],
                     ['D0', 'D1', 'D2', 'D3']], columns=list('ABCD'))
df2 = pd.DataFrame([['A4', 'A5', 'A6', 'A7'],
                     ['B4', 'B5', 'B6', 'B7'],
                     ['C4', 'C5', 'C6', 'C7'],
                     ['D4', 'D5', 'D6', 'D7']], columns=['A', 'B', 'C', 'D'], index=[2, 3, 4, 5])

#행방향 병합
print(pd.concat([df1,df2], axis = 1, join = 'outer'))
print('\n')
print(pd.concat([df1,df2], axis = 1, join = 'inner'))

 

 

[merge]

pd.merge(left, right , on = 'key') : 공통 key를 기준으로 inner join(default = inner) 

*inner join : 겹치는 것만

pd.merge(left, right, on = 'key', how = 'outer') : 공통key를 기준으로 outer join

*outer join : 첫번째 df의 key들 모두 하고 두번째 df의 key에선 안겹치는 애들만

pd.merge(left, right, on = 'key', how = 'left') : 공통key를 기준으로 첫번째 df에 맞춰 join

*df1의 key 돌면서 df2 merge해서 매칭되는 애들 다 가져옴

pd.merge(left, right, on = 'key', how = 'right') : 공통key를 기준으로 두번째 df에 맞춰 join

*df2의 key 돌면서 df1 merge해서 매칭되는 애들 다 가져옴

import pandas as pd

df1 = pd.DataFrame([['A0', 'A1', 'A2', '1'],
                     ['B0', 'B1', 'B2', '2'],
                     ['C0', 'C1', 'C2', '3'],
                     ['D0', 'D1', 'D2', '4']], columns=['A','B','C','Key'])
df2 = pd.DataFrame([['1', 'E0', 'E1', 'E2'],
                     ['2', 'F0', 'F1', 'F2'],
                     ['3', 'G0', 'G1', 'G2'],
                     ['4', 'H0', 'H1', 'H2']], columns=['Key','D','E','F'])
print(df1,'\n',df2)

print(pd.merge(df1, df2, on = 'Key'))

print(pd.merge(df1, df2, on = 'Key', how = 'outer'))

print(pd.merge(df1, df2, on = 'Key', how = 'right'))

 

 

 

 

이상 DataFrame, Pandas도 끝! 하지만 아직도 너무 많은 기능들,,

추가할 사항들 생기면 업로드 예정! 

다음 글은 matplotlib 활용한 데이터 시각화~

728x90

'Python > Data Analysis' 카테고리의 다른 글

데이터 시각화_matplotlib(1) - plt 기본 설정  (0) 2023.05.21
Numpy  (0) 2023.05.14