21.12.04 numpy, pandas

2021. 12. 5. 00:34작업/데이터분석

numpy

python에서 대규모 다차원 배열을 다룰 수 있게 도와주는 라이브러리

python list에 비해 빠른 연산 지원한다.

 

#list
list(range(10))

#numpy array
import numpy as np
np.array([1,2,3,4,5])

#2차원
np.array([[1,2],
		[3,4]])

list는 [1,'apple']이 가능하지만 np.array는 단일타입으로 구성된다.

np.zeros(10)

np.ones((3,5),dtype=float)

np.arange(0,20,2)

np.linspace(0,8,5)
# array([0,2,4,6,8])

np.random.random((2,2))
#2x2의 랜덤배열

np.random.normal(0,1,(2,2))
#2x2의 평균이 0 표준편차가 1인 랜덤배열

np.random.randint(0,10,(2,2))
#2x2 0~10사이 랜덤정수배열
x = np.random.randint(10,size=(3,4))

x.ndim #2
x.shape #(3,4)
x.size #12
x.dtype #dtype('int64')

#reshape
x = np.arange(8)
x.shape #(8,)

x2 = x.reshape(2,4) #2x4로 바꿔주세요
x2.shape #(2,4)


#concatenate
x = np.array([0,1,2])
y = np.array([3,4,5])
np.concatenate([x,y])

심화 concatenate

matrix = np.arange(4).reshape(2,2) #[[0,1] [2,3]]
np.concatenate([matrix, matrix], axis=0)

np.concatenate([matrix,matrix], axis=1)

upper, lower = np.split(matrix, [3], axis=0)

#가로방향으로 나눈다면
left, right = np.split(matrix, [3], axis=1)

numpy 연산 - 브로드캐스팅

브로드캐스팅이란? shape이 다른 array끼리 연산하는 것

3x3 matrix + 5 = 3x3 결과가 나옴. 각 요소에 5씩 더해짐

 

예를 들어 3x1 + 1x3은 3x3으로 채워서 계산함

집계 함수

x = np.arange(8).reshape((2,4))

np.sum(x)

np.min(x)

np.max(x)

np.mean(x)
import numpy as np

matrix = np.arange(8).reshape((2, 4))
print(matrix)

# Q1. sum 함수로 matrix의 총 합계를 구해 출력해보세요.
print(np.sum(matrix))

# Q2. max 함수로 matrix 중 최댓값을 구해 출력해보세요.
print(np.max(matrix))

# Q3. min 함수로 matrix 중 최솟값을 구해 출력해보세요.
print(np.min(matrix))

# Q4. mean 함수로 matrix의 평균값을 구해 출력해보세요.
print(np.mean(matrix))

# Q5. sum 함수의 axis 매개변수로 각 열의 합을 구해 출력해보세요.
print(np.sum(matrix,axis=0))

# Q6. sum 함수의 axis 매개변수로 각 행의 합을 구해 출력해보세요.
print(np.sum(matrix,axis=1))

# Q7. std 함수로 matrix의 표준편차를 구해 출력해보세요.
print(np.std(matrix))

# Q8. 마스킹 연산을 이용하여 matrix 중 5보다 작은 수들만 추출하여 출력해보세요.
print(matrix[matrix<5])

마스킹 연산 : true false문으로 조건 성립하는 요소 보기

x[x<3]

 

pandas

Series : numpy array가 보강된 형태 Data와 index를 가지고 있다. 이때 인덱스는 숫자가 아니어도 된다.

딕셔너리로 만들 수 있다.

import pandas as pd

data = pd.Series([1,2,3,4])
data = pd.Series([1,2,3,4],index = ['a','b','c','d'])

population_dict ={
	'korea':5180,
    'japan':12718,
    'china':141500,
    'usa':32676
}
population = pd.Series(population_dict)

 

DataFrame

여러 개의 Series가 모여서 행과 열을 이룸

# numpy array처럼 인덱스처럼 수정 가능

country['age']=people_age

# 저장 불러오기
country.to_csv('./country.csv')
country.to_excel('country.xlsx')

country = pd.read_csv('./country.csv')
country = pd.read_excel('country.xlsx')

indexing / slicing

# loc '내 인덱스'
country.loc['china']
country.loc['japan':'korea', :'population'] # [,]

# iloc [0] 숫자
country.iloc[0]
country.iloc[1:3, :2]

DataFrame 새 데이터 추가,수정

user = pd.DataFrame(columns=['이름','나이','주소'])
user.loc[0] = ['서윤','23','서울']
user.loc[1] = {'이름':'서윤','나이':'23','주소':'서울'}
user.loc[1,'이름']='성윤' #수정

컬럼 선택하기

user['이름'] #컬럼 이름이 하나면 Series
user[['이름','주소','나이']] # 컬럼이 리스트로 들어가 있으면 DataFrame

누락된 데이터 체크

user.isnull()
user.notnull() #True 또는 False로 값이 나옴

# dropna()
user.dropna()
user['전화번호'] = user['전화번호'].fillna('전화번호 없음') # na를 채움

A.add(B,fill_value = 0)

A = pd.DataFrame(np.random.randint(0,10,(2,2)), columns=list("AB"))
B = pd.DataFrame(np.random.randint(0,10,(3,3)), columns=list("BAC"))
A + B # 안겹치는 부분 크기가 안맞는 부분은 NaN
A.add(B,fill_value=0) # 안겹치는 부분 크기가 안맞는 부분은 NaN이나 그걸 0으로 채운다.

DataFrame 값 정렬하기

df = pd.DataFrame({
	'col1':[2,1,9,8,7,4],
    'col2':['A','A','B',np.nan,'D','C'],
    'col3':[0,1,9,4,2,3],

})

df.sort_values('col1') # col1의 컬럼값 기준으로 데이터를 정렬시킴

df.sort_values('col1',ascending=False)

df.sort_values(['col2','col1']) # col2로 먼저 정렬하고 그다음 col1정렬

미션 잭과 콩나무 height

조건으로 검색하기

import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.rand(5,2), columns=['A','B'])
df['A'] < 0.5

# DataFrame row 추출
df[(df['A']<0.5) & (df['B']>0.3)] # 여까지 하면 true false인 series가 나옴.
df.query('A < 0.5 and B > 0.3') 

# 문자열 검색
df['Animal'].str.contains('Cat')
df.Animal.str.match('Cat')

함수로 데이터 처리하기 - apply()

df = pd.DataFrame(np.arange(5), columns = ['Num'])
def square(x):
	return x**2
df['Num'].apply(square) # 함수
df['Square'] = df.Num.apply(lambda x:x**2) # 람다사용

replace

df['Sex'] = df.Sex.replace({'Male':0, 'Female':1})
df.Sex.replace({'Male':0, 'Female':1}, inplace=True) # 바로대입

그룹으로 묶기 - groupby()

df.groupby('컬럼명').sum()

df.groupby(['컬1','컬2']).sum()

- aggregate

filter

groupby로 묶은 후에도 apply 적용이 가능하다.

get_group

df.groupby('시도').get_group('충남')

MultiIndex

df = pd.DataFrame(
	np.random.randn(4,2),
    index=[['A','A','B','B'],[1,2,1,2]],
    columns=['data1','data2']
)

df['A']['1'] # loc,iloc 사용 가능

 

pivot_table

데이터에서 필요한 자료만 뽑아서 새롭게 요약

index는 행 인덱스로 들어갈 key

column에 열 인덱스로 라벨링될 값

value에 분석할 데이터

 

# 타이타닉 데이터에서 성별과 좌석별 생존률 구하기

df.pivot_table(
	index='sex', columns='class', values='survived',
    aggfunc=np.mean
)

 

피리부는 사나이

import pandas as pd
import numpy as np


# 파일을 읽어서 코드를 작성해보세요
# 경로: "./data/the_pied_piper_of_hamelin.csv"

data = pd.read_csv('./data/the_pied_piper_of_hamelin.csv')
print(data)

# 피리부는 사나이를 따라간 어린이들 중 남자 어린이와 여자 어린이의 평균 연령을 표로 출력해보려고 합니다.
children = data[data['구분']=='Child']
print(children.head(10))
# sol1.
print(children.groupby('일차').mean())
# sol2.
print(children.pivot_table(index='일차', columns='성별', values='나이', aggfunc=np.mean))