30분 요약 강좌 시즌2 : Python 활용편 - 섹션3. Numpy와 Pandas
2021. 9. 5. 16:15ㆍ빅데이터 스터디
1.Numpy¶
In [1]:
import numpy as np
In [3]:
data = [[1,2,3],[4,5,6],[7,8,9]]
a = np.array(data)
a
#ndarray
Out[3]:
array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
In [4]:
a.dtype
Out[4]:
dtype('int32')
In [5]:
type(a)
Out[5]:
numpy.ndarray
In [7]:
a = a.astype(np.float32) #a = a.astype('float32')
a
Out[7]:
array([[1., 2., 3.], [4., 5., 6.], [7., 8., 9.]], dtype=float32)
In [9]:
a[0][1]
Out[9]:
2.0
In [11]:
np.arange(1,10,2) #(start,stop,step)
Out[11]:
array([1, 3, 5, 7, 9])
In [12]:
np.arange(1,10).reshape(3,3) #3x3행렬
Out[12]:
array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
In [14]:
np.arange(1,13).reshape(3,2,2) #3차원행렬
Out[14]:
array([[[ 1, 2], [ 3, 4]], [[ 5, 6], [ 7, 8]], [[ 9, 10], [11, 12]]])
In [15]:
np.nan * 10 #결측치 None 과 같다 평균을 낼때 주로 사용
Out[15]:
nan
In [18]:
a[0][1] = np.nan
a #float 형에서만 nan을 사용할 수 있다.int형에서는 사용 불가
Out[18]:
array([[ 1., nan, 3.], [ 4., 5., 6.], [ 7., 8., 9.]], dtype=float32)
In [23]:
a = np.linspace(1,10,20) #(초기값,종료값,개수) step이 아님에 주의
a
Out[23]:
array([ 1. , 1.47368421, 1.94736842, 2.42105263, 2.89473684, 3.36842105, 3.84210526, 4.31578947, 4.78947368, 5.26315789, 5.73684211, 6.21052632, 6.68421053, 7.15789474, 7.63157895, 8.10526316, 8.57894737, 9.05263158, 9.52631579, 10. ])
연산¶
In [25]:
data = np.arange(1,10).reshape(3,3)
data
Out[25]:
array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
In [28]:
data + data
Out[28]:
array([[ 2, 4, 6], [ 8, 10, 12], [14, 16, 18]])
In [29]:
data - data
Out[29]:
array([[0, 0, 0], [0, 0, 0], [0, 0, 0]])
In [30]:
data * data
Out[30]:
array([[ 1, 4, 9], [16, 25, 36], [49, 64, 81]])
In [31]:
data / data
Out[31]:
array([[1., 1., 1.], [1., 1., 1.], [1., 1., 1.]])
In [32]:
np.dot(data,data) #행렬 곱
Out[32]:
array([[ 30, 36, 42], [ 66, 81, 96], [102, 126, 150]])
In [33]:
data @ data #행렬곱
Out[33]:
array([[ 30, 36, 42], [ 66, 81, 96], [102, 126, 150]])
차원¶
In [55]:
# 0차원 : 스칼라
a = np.array(1)
a
a.shape #a의 모양
a.ndim #0차원
Out[55]:
()
In [45]:
# 1차원 : 벡터
a = np.array([1])
a
a.shape # a 의 모양
a.ndim # 1차원
Out[45]:
1
In [49]:
# 1차원 : 벡터
a = np.array([1,2,3,4,5])
a
a.shape # a 의 모양
# a.ndim # 1차원
Out[49]:
(5,)
In [54]:
# 2차원 : 메트릭스
a = np.array([[1,2,3],[4,5,6]])
a
a.shape #2X3 행렬
a.ndim
Out[54]:
2
In [61]:
#3차원 : 3차원 이상의 다차원의 행렬을 Tensor
a = np.array([[[1,2],[3,4],[5,6]], [[7,8],[9,10],[11,12]]])
a
a.shape
a.ndim
Out[61]:
3
matrix의 유형¶
In [63]:
a = np.arange(12).reshape(2,3,2) #2x3x2 행렬
a
Out[63]:
array([[[ 0, 1], [ 2, 3], [ 4, 5]], [[ 6, 7], [ 8, 9], [10, 11]]])
In [66]:
b = np.ones(12).reshape(2,3,2) #1로 채워진 2x3x2 행렬
b
Out[66]:
array([[[1., 1.], [1., 1.], [1., 1.]], [[1., 1.], [1., 1.], [1., 1.]]])
In [67]:
c = np.zeros(12).reshape(2,3,2) #0으로 채워진 2x3x2 행렬
c
Out[67]:
array([[[0., 0.], [0., 0.], [0., 0.]], [[0., 0.], [0., 0.], [0., 0.]]])
In [69]:
d = np.eye(3) #3x3 단위행렬
d
Out[69]:
array([[1., 0., 0.], [0., 1., 0.], [0., 0., 1.]])
In [71]:
f = np.empty([2,3]) #0에 가까운 값들로 채움
f
Out[71]:
array([[4.63939877e-308, 5.64938534e+036, 1.78409531e+046], [4.32950182e-035, 8.72433218e-026, 1.57234264e-063]])
In [75]:
g = np.full((3,4),1000) #1000으로 채운 3X4행렬
g
Out[75]:
array([[1000, 1000, 1000, 1000], [1000, 1000, 1000, 1000], [1000, 1000, 1000, 1000]])
In [76]:
h = np.linspace(2,10,6) #2부터 10 까지 선형으로 채워진 행렬
h
Out[76]:
array([ 2. , 3.6, 5.2, 6.8, 8.4, 10. ])
집계함수¶
In [78]:
a = np.arange(10).reshape(2,5)
a
Out[78]:
array([[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]])
In [79]:
a[0][0] = 100
a
Out[79]:
array([[100, 1, 2, 3, 4], [ 5, 6, 7, 8, 9]])
In [81]:
a[0,1] = 1000 #0행 1열에 1000대입
a
Out[81]:
array([[ 100, 1000, 2, 3, 4], [ 5, 6, 7, 8, 9]])
In [83]:
np.mean(a) #평균
Out[83]:
114.4
In [87]:
np.median(a) #중간값
Out[87]:
6.5
In [86]:
np.std(a) #표준편차
Out[86]:
296.5485457728633
In [89]:
np.var(a) #분산
Out[89]:
87941.04
In [91]:
np.sum(a) #합계
Out[91]:
1144
In [93]:
np.sum(a, axis = 0) #column의 합
Out[93]:
array([ 105, 1006, 9, 11, 13])
In [96]:
np.sum(a, axis = 1) #row의 합
Out[96]:
array([1109, 35])
In [98]:
np.max(a) #마찬가지로 min, max 또한 axis 설정 가능
Out[98]:
1000
In [101]:
np.min(a)
Out[101]:
2
2.pandas¶
In [102]:
import pandas as pd
In [110]:
data = np.arange(0,50,10)
data
Out[110]:
array([ 0, 10, 20, 30, 40])
In [111]:
a = pd.Series(data,index=['a','b','c','d','e']) #인덱스 설정
a
Out[111]:
a 0 b 10 c 20 d 30 e 40 dtype: int32
In [112]:
b = pd.Series(data) #인덱스 미설정
b
Out[112]:
0 0 1 10 2 20 3 30 4 40 dtype: int32
In [114]:
a['b']
Out[114]:
10
In [116]:
a.loc['b'] #명시적 인덱스
Out[116]:
10
In [118]:
a.iloc[1] #순서(암시적 인덱스)
Out[118]:
10
In [122]:
a+10
a-10
a*10
a**2
a/5
a//5
a%3
Out[122]:
a 0 b 1 c 2 d 0 e 1 dtype: int32
In [123]:
a
Out[123]:
a 0 b 10 c 20 d 30 e 40 dtype: int32
In [125]:
a > 15
Out[125]:
a False b False c True d True e True dtype: bool
In [ ]:
a[a > 15] #boolean indexing 15보다 큰 값들 indexing
Out[ ]:
c 20 d 30 e 40 dtype: int32
집계함수¶
In [129]:
a.add(100)
Out[129]:
a 100 b 110 c 120 d 130 e 140 dtype: int32
In [130]:
a.sub(100)
Out[130]:
a -100 b -90 c -80 d -70 e -60 dtype: int32
In [131]:
a.mul(100)
Out[131]:
a 0 b 1000 c 2000 d 3000 e 4000 dtype: int32
In [132]:
a.div(100)
Out[132]:
a 0.0 b 0.1 c 0.2 d 0.3 e 0.4 dtype: float64
In [133]:
a.mod(100) #나머지
Out[133]:
a 0 b 10 c 20 d 30 e 40 dtype: int32
In [134]:
a.min()
Out[134]:
0
In [135]:
a.max()
Out[135]:
40
In [136]:
a.sum()
Out[136]:
100
In [137]:
a.mean()
Out[137]:
20.0
In [138]:
a.median()
Out[138]:
20.0
In [139]:
a.std()
Out[139]:
15.811388300841896
In [140]:
a.var()
Out[140]:
250.0
DataFrame¶
In [143]:
rawData = np.random.randint(50,100,size=(4,3)) #50부터 100 사이의 4X3행렬
rawData
Out[143]:
array([[73, 92, 93], [51, 78, 83], [58, 72, 57], [90, 87, 91]])
In [201]:
df = pd.DataFrame(rawData,index =['1반','2반','3반','4반'],columns=['국','영','수'])
df
Out[201]:
국 | 영 | 수 | |
---|---|---|---|
1반 | 73 | 92 | 93 |
2반 | 51 | 78 | 83 |
3반 | 58 | 72 | 57 |
4반 | 90 | 87 | 91 |
In [202]:
#df[0] -> Error
df['국'] #column 값이 먼저 들어감 리스트와의 차이
Out[202]:
1반 73 2반 51 3반 58 4반 90 Name: 국, dtype: int32
In [203]:
df['평균'] = round((df['국'] + df['영'] + df['수'])/3,2)
df
Out[203]:
국 | 영 | 수 | 평균 | |
---|---|---|---|---|
1반 | 73 | 92 | 93 | 86.00 |
2반 | 51 | 78 | 83 | 70.67 |
3반 | 58 | 72 | 57 | 62.33 |
4반 | 90 | 87 | 91 | 89.33 |
In [204]:
df['na'] = np.nan #결측치
df
Out[204]:
국 | 영 | 수 | 평균 | na | |
---|---|---|---|---|---|
1반 | 73 | 92 | 93 | 86.00 | NaN |
2반 | 51 | 78 | 83 | 70.67 | NaN |
3반 | 58 | 72 | 57 | 62.33 | NaN |
4반 | 90 | 87 | 91 | 89.33 | NaN |
In [205]:
del df['na'] #column 지우기
df
Out[205]:
국 | 영 | 수 | 평균 | |
---|---|---|---|---|
1반 | 73 | 92 | 93 | 86.00 |
2반 | 51 | 78 | 83 | 70.67 |
3반 | 58 | 72 | 57 | 62.33 |
4반 | 90 | 87 | 91 | 89.33 |
In [206]:
df[df.평균 > 75] #평균 75점 이상만 출력(boolean indexing)
Out[206]:
국 | 영 | 수 | 평균 | |
---|---|---|---|---|
1반 | 73 | 92 | 93 | 86.00 |
4반 | 90 | 87 | 91 | 89.33 |
In [207]:
df = df.drop(['평균'], axis= 'columns') #평균 drop 축은 columns
df
Out[207]:
국 | 영 | 수 | |
---|---|---|---|
1반 | 73 | 92 | 93 |
2반 | 51 | 78 | 83 |
3반 | 58 | 72 | 57 |
4반 | 90 | 87 | 91 |
결측값 처리¶
In [208]:
df = df.astype('float64')
df
Out[208]:
국 | 영 | 수 | |
---|---|---|---|
1반 | 73.0 | 92.0 | 93.0 |
2반 | 51.0 | 78.0 | 83.0 |
3반 | 58.0 | 72.0 | 57.0 |
4반 | 90.0 | 87.0 | 91.0 |
In [209]:
df['수'][2] = np.nan
df
Out[209]:
국 | 영 | 수 | |
---|---|---|---|
1반 | 73.0 | 92.0 | 93.0 |
2반 | 51.0 | 78.0 | 83.0 |
3반 | 58.0 | 72.0 | NaN |
4반 | 90.0 | 87.0 | 91.0 |
In [210]:
df.dropna(axis = 0) #원본변경 X, 원본변경원할경우 inplace =True
Out[210]:
국 | 영 | 수 | |
---|---|---|---|
1반 | 73.0 | 92.0 | 93.0 |
2반 | 51.0 | 78.0 | 83.0 |
4반 | 90.0 | 87.0 | 91.0 |
In [211]:
# df.dropna(axis =0, inplace=True)
# df
In [212]:
df.dropna(axis = 1) #column 단위 삭제
Out[212]:
국 | 영 | |
---|---|---|
1반 | 73.0 | 92.0 |
2반 | 51.0 | 78.0 |
3반 | 58.0 | 72.0 |
4반 | 90.0 | 87.0 |
In [213]:
df.fillna('hello') #결측값 문자열로 채우기
Out[213]:
국 | 영 | 수 | |
---|---|---|---|
1반 | 73.0 | 92.0 | 93.0 |
2반 | 51.0 | 78.0 | 83.0 |
3반 | 58.0 | 72.0 | hello |
4반 | 90.0 | 87.0 | 91.0 |
In [215]:
df.fillna(df.mean()) #결측값 평균으로 채우기
Out[215]:
국 | 영 | 수 | |
---|---|---|---|
1반 | 73.0 | 92.0 | 93.0 |
2반 | 51.0 | 78.0 | 83.0 |
3반 | 58.0 | 72.0 | 89.0 |
4반 | 90.0 | 87.0 | 91.0 |
In [217]:
df.fillna(0) #결측값 0으로 채우기
Out[217]:
국 | 영 | 수 | |
---|---|---|---|
1반 | 73.0 | 92.0 | 93.0 |
2반 | 51.0 | 78.0 | 83.0 |
3반 | 58.0 | 72.0 | 0.0 |
4반 | 90.0 | 87.0 | 91.0 |
MultiIndex¶
In [219]:
df
Out[219]:
국 | 영 | 수 | |
---|---|---|---|
1반 | 73.0 | 92.0 | 93.0 |
2반 | 51.0 | 78.0 | 83.0 |
3반 | 58.0 | 72.0 | NaN |
4반 | 90.0 | 87.0 | 91.0 |
In [220]:
df.T #column 과 row 바꾸기
Out[220]:
1반 | 2반 | 3반 | 4반 | |
---|---|---|---|---|
국 | 73.0 | 51.0 | 58.0 | 90.0 |
영 | 92.0 | 78.0 | 72.0 | 87.0 |
수 | 93.0 | 83.0 | NaN | 91.0 |
In [225]:
df.index = [['1학년','1학년','2학년','2학년'],['1반','2반','1반','2반']]
df
Out[225]:
국 | 영 | 수 | ||
---|---|---|---|---|
1학년 | 1반 | 73.0 | 92.0 | 93.0 |
2반 | 51.0 | 78.0 | 83.0 | |
2학년 | 1반 | 58.0 | 72.0 | NaN |
2반 | 90.0 | 87.0 | 91.0 |
In [227]:
df.columns = [['언어','언어','수리'],['국','영','수']]
df
Out[227]:
언어 | 수리 | |||
---|---|---|---|---|
국 | 영 | 수 | ||
1학년 | 1반 | 73.0 | 92.0 | 93.0 |
2반 | 51.0 | 78.0 | 83.0 | |
2학년 | 1반 | 58.0 | 72.0 | NaN |
2반 | 90.0 | 87.0 | 91.0 |
In [231]:
df['언어']['국'] #column 값 출력
Out[231]:
1학년 1반 73.0 2반 51.0 2학년 1반 58.0 2반 90.0 Name: 국, dtype: float64
In [234]:
df.iloc[0] #row 값 출력
Out[234]:
언어 국 73.0 영 92.0 수리 수 93.0 Name: (1학년, 1반), dtype: float64
In [236]:
df.loc['1학년']
Out[236]:
언어 | 수리 | ||
---|---|---|---|
국 | 영 | 수 | |
1반 | 73.0 | 92.0 | 93.0 |
2반 | 51.0 | 78.0 | 83.0 |
데이터 사전 분석¶
In [240]:
df.info() #dataframe의 기본 정보
<class 'pandas.core.frame.DataFrame'> MultiIndex: 4 entries, ('1학년', '1반') to ('2학년', '2반') Data columns (total 3 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 (언어, 국) 4 non-null float64 1 (언어, 영) 4 non-null float64 2 (수리, 수) 3 non-null float64 dtypes: float64(3) memory usage: 384.0+ bytes
In [241]:
df.head() #맨 처음 데이터 5개 까지
Out[241]:
언어 | 수리 | |||
---|---|---|---|---|
국 | 영 | 수 | ||
1학년 | 1반 | 73.0 | 92.0 | 93.0 |
2반 | 51.0 | 78.0 | 83.0 | |
2학년 | 1반 | 58.0 | 72.0 | NaN |
2반 | 90.0 | 87.0 | 91.0 |
In [244]:
df.tail() #맨 마지막 데이터 5개 까지
Out[244]:
언어 | 수리 | |||
---|---|---|---|---|
국 | 영 | 수 | ||
1학년 | 1반 | 73.0 | 92.0 | 93.0 |
2반 | 51.0 | 78.0 | 83.0 | |
2학년 | 1반 | 58.0 | 72.0 | NaN |
2반 | 90.0 | 87.0 | 91.0 |
In [246]:
df.dtypes
Out[246]:
언어 국 float64 영 float64 수리 수 float64 dtype: object
In [248]:
df.describe() #평균 표준편차 분위값
Out[248]:
언어 | 수리 | ||
---|---|---|---|
국 | 영 | 수 | |
count | 4.000000 | 4.000000 | 3.000000 |
mean | 68.000000 | 82.250000 | 89.000000 |
std | 17.301252 | 8.958236 | 5.291503 |
min | 51.000000 | 72.000000 | 83.000000 |
25% | 56.250000 | 76.500000 | 87.000000 |
50% | 65.500000 | 82.500000 | 91.000000 |
75% | 77.250000 | 88.250000 | 92.000000 |
max | 90.000000 | 92.000000 | 93.000000 |
In [251]:
df.isnull() #결측치 판단
Out[251]:
언어 | 수리 | |||
---|---|---|---|---|
국 | 영 | 수 | ||
1학년 | 1반 | False | False | False |
2반 | False | False | False | |
2학년 | 1반 | False | False | True |
2반 | False | False | False |
In [254]:
df.isnull().sum() #결측치 개수 None 값도 결측치로 판단
Out[254]:
언어 국 0 영 0 수리 수 1 dtype: int64
값의 연결¶
In [259]:
a = pd.DataFrame(np.arange(1,10).reshape(3,3))
a
Out[259]:
0 | 1 | 2 | |
---|---|---|---|
0 | 1 | 2 | 3 |
1 | 4 | 5 | 6 |
2 | 7 | 8 | 9 |
In [261]:
b = pd.Series(np.arange(10,40,10))
b
Out[261]:
0 10 1 20 2 30 dtype: int32
In [263]:
pd.concat([a,b],axis = 1) #옆으로 합치기
Out[263]:
0 | 1 | 2 | 0 | |
---|---|---|---|---|
0 | 1 | 2 | 3 | 10 |
1 | 4 | 5 | 6 | 20 |
2 | 7 | 8 | 9 | 30 |
In [266]:
pd.concat([a,b],axis = 1,ignore_index=True) #옆으로 합치기, 인덱스 연속
Out[266]:
0 | 1 | 2 | 3 | |
---|---|---|---|---|
0 | 1 | 2 | 3 | 10 |
1 | 4 | 5 | 6 | 20 |
2 | 7 | 8 | 9 | 30 |
In [267]:
a.append(b, ignore_index=True) #밑에 합치기 , 인덱스 연속
Out[267]:
0 | 1 | 2 | |
---|---|---|---|
0 | 1 | 2 | 3 |
1 | 4 | 5 | 6 |
2 | 7 | 8 | 9 |
3 | 10 | 20 | 30 |
'빅데이터 스터디' 카테고리의 다른 글
30분 요약 강좌 시즌2 : Python 활용편 섹션4-웹크롤링 연습문제-1 (0) | 2021.09.17 |
---|---|
30분 요약 강좌 시즌2 : Python 활용편 섹션4-웹크롤링 (0) | 2021.09.17 |
30분 요약 강좌 시즌2 : Python 활용편-섹션3. Visualization (0) | 2021.09.05 |
30분 요약 강좌 시즌2 : Python 활용편 - 섹션 2. Python-2 (0) | 2021.09.05 |
30분 요약 강좌 시즌2 : Python 활용편 - 섹션 2. Python-1 (0) | 2021.09.05 |