👨🏻‍💻

ch1 - 3. 파이썬 Pandas 기초

3.1 Pandas 개요

Index

  • Pandas란?
  • Pandas 모듈 사용하기

3.1.1 Pandas 란?

 
pandas는 python에서 데이터 분석 및 처리 하기 위한 유용한 라이브러리로 python으로 데이터 과학을 하기 위해서 없어서는 안될 도구입니다. Pandas에서는 데이터 타입을 크게 Series와 DataFrame으로 두가지로 나뉘어서 다루고 있습니다.
 

3.1.2 Pandas 모듈 사용하기

 
먼저 커맨드 창에 들어가서 pandas 모듈을 설치합니다.
notion imagenotion image
 
Pandas를 사용하기 위해 pandas 모듈을 import합니다. pandas 외에 행렬이나 배열 구조를 손쉽게 처리할 수 있는 numpy도 함께 import 합니다.
 
notion imagenotion image
 
※ 만약 Shift + enter 을 누른후 아무런 문제가 없으면 pandas 모듈이 설치가 잘 된 것입니다.
 

3.2 Pandas Series 사용

Index

  • Series 개요
  • Series 만들기
  • Series 연산
  • 다양한 Series Function

 

3.2.1 Series 개요

 
series 라는 것은 pandas의 1차원적인 데이터 타입을 말합니다. 또한 모든 유형(정수, 문자열, 부동 소수점, 파이썬 객체 등)의 데이터를 보유할 수 있습니다.
 

3.2.2 Series 만들기

 
간단하게 series를 만들겠습니다.
In
series = pd.Series([1,3,5,np.nan,7,9]) series
Out
0 1.0 1 3.0 2 5.0 3 NaN 4 7.0 5 9.0 dtype : float64
 
Series에서 slice 하면 true 값들만 반환합니다.
In
series[series>3.0]
Out
2 5.0 4 7.0 5 9.0 dtype : float64
 

3.2.3 Series 연산

 
series를 이용하여 바이너리 연산을 수행할 수 있습니다.
 
In
data1 = pd.Series([11,13,21,17,23], index = ['a','b','c','d','e']) data2 = pd.Series([1,3,5,7,9], index = ['a','b','c','d','e']) print(data1,"\n\n",data2)
Out
a 11 b 13 c 21 d 17 e 23 dtype : int64 a 1 b 3 c 5 d 7 e 9 dtype : int64
 
이제 .add( ) 함수를 이용하여 두개의 Series를 더합니다.
In
data1.add(data2, fill_value = 0)
Out
a 12 b 16 c 26 d 24 e 32 dtype : int64
 

 

3.2.4 다양한 Series Function

 
notion imagenotion image
method 사용 전 입력 패러미터의 개수와 종류를 잘 확인해주세요.
pandas를 만든 회사의 홈페이지로 각 method들에 대한 설명과 예시 코드를 볼 수 있습니다.
 
notion imagenotion image

3.3 DataFrame 다루기

목차

  • Read and Explore Dataset
  • 데이터 한눈에 훑어보기
  • 데이터프레임 변수 간 관계
  • Select and Slice
  • Boolean Indexing
  • Pandas Math
  • Process DataFrame
  • Pandas for Machine Learning
 

Read and Explore DataSet

데이터를 불러오고 DataSet에 대한 전반적인 정보를 파악하는 방법입니다. 데이터를 불러왔을 때 가장 먼저 해야 할 일입니다.
 
우선 엑셀 파일을 불러오는 작업과 저장하는 작업부터 시작해보겠습니다.

엑셀 파일 불러오기

# Excel 파일 위치 excel_path = "datasets/wine_dataset.xlsx" df = pd.read_excel(excel_path)
엑셀 파일이 저장된 위치를 excel_path에 넣어주세요. 그리고  df = pd.read_excel(엑셀파일위치) 를 하면 DataFrame 인 df라는 변수에 엑셀 파일을 읽어올 수 있습니다.
 

엑셀 파일 저장하기

작업 완료 후 excel 파일을 저장할 수도 있습니다. 위 코드에서 만든 df를 다시 excel 파일로 저장합니다.
# Excel로 저장 가능 df.to_csv('test.csv')
 
notion imagenotion image
 df.to_csv(파일이름) 을 통해 위와 같이 test.csv 파일이 생성된 것을 볼 수 있습니다.
 

데이터 한눈에 훑어보기

이 섹션에서는 불러온 데이터가 어떻게 생겼는지 대략적으로 훑어보는 방법을 다룹니다.

df.head()

데이터의 가장 위 다섯 개의 row를 볼 수 있는 함수입니다. Python에서는 0부터 숫자를 세기 시작합니다.
In
df.head()
Out
notion imagenotion image
 

df.tail(3)

df.tail()은 데이터의 가장 아래 다섯 개의 row를 볼 수 있는 함수입니다. df.tail()이나 df.head()에 인자값을 넣어주면 그 개수만큼의 row를 출력합니다.
In
df.tail(3)
Out
notion imagenotion image
 

df.describe()

데이터에 대한 간단한 통계적 요약을 보여주는 함수입니다.
count 는 데이터의 개수, mean은 평균 값, std는 표준편차, min은 최솟값을 나타내며 4분위수(25%, 50%, 75%)에 해당하는 값과 최댓값(max)의 정보를 보여줍니다. 아래 데이터에서는 alcohol의 평균값은 13.000618이고, 최댓값은 14.830000 인 것을 알 수 있습니다.
In
df.describe()
Out
notion imagenotion image
 

df.info()

데이터에 대한 간단한 정보를 알려주는 함수입니다.
In
df.info()
Out
<class 'pandas.core.frame.DataFrame'> RangeIndex: 178 entries, 0 to 177 Data columns (total 14 columns): alcohol 178 non-null float64 malic_acid 178 non-null float64 ash 178 non-null float64 alcalinity_of_ash 178 non-null float64 magnesium 178 non-null int64 total_phenols 178 non-null float64 flavanoids 178 non-null float64 nonflavanoid_phenols 178 non-null float64 proanthocyanins 178 non-null float64 color_intensity 178 non-null float64 hue 178 non-null float64 od280/od315_of_diluted_wines 178 non-null float64 proline 178 non-null int64 target 178 non-null int64 dtypes: float64(11), int64(3) memory usage: 19.5 KB

df.columns

데이터에 어떤 컬럼이 있는지 살펴볼까요?  df.columns 는 데이터의 컬럼 라벨을 출력해줍니다. columns는 DataFrame의 메소드가 아니라 property 이므로 끝에 () 를 붙이지 않습니다.
In
df.columns
Out
Index(['alcohol', 'malic_acid', 'ash', 'alcalinity_of_ash', 'magnesium', 'total_phenols', 'flavanoids', 'nonflavanoid_phenols', 'proanthocyanins', 'color_intensity', 'hue', 'od280/od315_of_diluted_wines', 'proline', 'target'], dtype='object')

df.columns[2:4]

columns에 [2:4]와 같이 인덱스 값을 줌으로써 2번째 컬럼부터 3번째 컬럼까지만 출력할 수도 있습니다. Python은 0부터 숫자를 센다는 것에 주의하세요. [2:4]라고 인덱스 값을 주면 2, 3번째 컬럼만 출력되고 4번째 컬럼은 출력되지 않습니다.
In
df.columns[2:4]
Out
Index(['ash', 'alcalinity_of_ash'], dtype='object')
 

df.index

DataFrame의 index에 대한 정보입니다.
In
df.index
Out
RangeIndex(start=0, stop=178, step=1)

df.values

DataFrame 의 값들을 array로 return합니다.
In
df.values
Out
array([[ 14.23, 1.71, 2.43, ..., 3.92, 1065. , 0. ], [ 13.2 , 1.78, 2.14, ..., 3.4 , 1050. , 0. ], [ 13.16, 2.36, 2.67, ..., 3.17, 1185. , 0. ], ..., [ 13.27, 4.28, 2.26, ..., 1.56, 835. , 2. ], [ 13.17, 2.59, 2.37, ..., 1.62, 840. , 2. ], [ 14.13, 4.1 , 2.74, ..., 1.6 , 560. , 2. ]])

df.['alcohol'].unique()

pandas.Series.unique() 는 Series 에서 중복을 제거한 유일한 값을 return 합니다.
In
s = pd.Series([2, 1, 3, 3], name='A') s.unique()
Out
array([2, 1, 3], dtype=int64)
 
DataFrame의 특정 컬럼에서 unique한 값을 추출할 수 있습니다.
In
df['alcohol'].unique()
Out
array([14.23, 13.2 , 13.16, 14.37, 13.24, 14.2 , 14.39, 14.06, 14.83, 13.86, 14.1 , 14.12, 13.75, 14.75, 14.38, 13.63, 14.3 , 13.83, 14.19, 13.64, 12.93, 13.71, 12.85, 13.5 , 13.05, 13.39, 13.3 , 13.87, 14.02, 13.73, 13.58, 13.68, 13.76, 13.51, 13.48, 13.28, 13.07, 14.22, 13.56, 13.41, 13.88, 14.21, 13.9 , 13.94, 13.82, 13.77, 13.74, 13.29, 13.72, 12.37, 12.33, 12.64, 13.67, 12.17, 13.11, 13.34, 12.21, 12.29, 13.49, 12.99, 11.96, 11.66, 13.03, 11.84, 12.7 , 12. , 12.72, 12.08, 12.67, 12.16, 11.65, 11.64, 12.69, 11.62, 12.47, 11.81, 12.6 , 12.34, 11.82, 12.51, 12.42, 12.25, 12.22, 11.61, 11.46, 12.52, 11.76, 11.41, 11.03, 12.77, 11.45, 11.56, 11.87, 12.07, 12.43, 11.79, 12.04, 12.86, 12.88, 12.81, 12.53, 12.84, 13.36, 13.52, 13.62, 12.87, 13.32, 13.08, 12.79, 13.23, 12.58, 13.17, 13.84, 12.45, 14.34, 12.36, 13.69, 12.96, 13.78, 13.45, 12.82, 13.4 , 12.2 , 14.16, 13.27, 14.13]) ​

Transformation

DataFrame의 행과 열을 바꾸어 출력합니다.
In
df.T
Out
notion imagenotion image

데이터프레임 변수 간 관계

df.cov()

데이터프레임의 모든 변수 간 공분산(covariance)을 계산하여 리턴합니다.
 
공분산(covariance)이란 2개의 확률변수의 상관정도를 나타내는 값입니다. 만약 2개의 변수중 하나의 값이 상승하는 경향을 보일 때, 다른 값도 상승하는 경향의 상관관계에 있다면, 공분산의 값은 양수가 됩니다. 반대로 2개의 변수중 하나의 값이 상승하는 경향을 보일 때, 다른 값이 하강하는 경향을 보인다면 공분산의 값은 음수가 됩니다.
이렇게 공분산은 상관관계의 상승 혹은 하강하는 경향을 이해할 수 있으나, 주의할 점은 2개 변수의 측정 단위의 크기에 따라 공분산 값이 달라지므로 상관분석을 통해 정도를 파악하기에는 부적절하다는 것입니다.
 
In
df = pd.DataFrame([(1, 2), (0, 3), (2, 0), (1, 1)], columns=['dogs', 'cats']) print(df) print(df.cov())
Out
dogs cats 0 1 2 1 0 3 2 2 0 3 1 1 dogs cats dogs 0.666667 -1.000000 cats -1.000000 1.666667

df.corr()

상관 분석(correlation analysis)은 두 변수간에 어떤 선형적 관계를 갖고 있는 지를 분석하는 방법입니다. 두변수는 서로 독립적인 관계이거나 상관된 관계일 수 있으며 이때 두 변수간의 관계의 강도를 상관관계(Correlation, Correlation coefficient)라 합니다.
상관관계의 정도를 파악하는 상관계수(Correlation coefficient)는 두 변수간의 연관된 정도를 나타낼 뿐 인과관계를 설명하는 것은 아닙니다.
 
 
피어슨 상관 계수 (Pearson correlation coefficient)는 두 변수간의 관련성을 구하기 위해 보편적으로 이용됩니다. 피어슨 상관계수의 개념은 다음과 같습니다.
r = X와 Y가 함께 변하는 정도 / X와 Y가 각각 변하는 정도
 
  • 결과의 해석
피어슨 상관계수 값은 X 와 Y 가 완전히 동일하면 +1, 전혀 다르면 0, 반대방향으로 완전히 동일 하면 –1 을 가집니다. 결정계수 (coefficient of determination) 는 r^2 로 계산하며 이것은 X 로부터 Y 를 예측할 수 있는 정도를 의미합니다.
 
일반적으로, 피어슨 상관계수 r이
-1.0과 -0.7 사이이면, 강한 음적 선형관계,
-0.7과 -0.3 사이이면, 뚜렷한 음적 선형관계,
-0.3과 -0.1 사이이면, 약한 음적 선형관계,
-0.1과 +0.1 사이이면, 거의 무시될 수 있는 선형관계,
+0.1과 +0.3 사이이면, 약한 양적 선형관계,
+0.3과 +0.7 사이이면, 뚜렷한 양적 선형관계,
+0.7과 +1.0 사이이면, 강한 양적 선형관계
로 해석합니다.
 
df.corr() 은 NA/null 값을 제외한 데이터프레임의 모든 변수 간 상관계수(Correlation coefficient)를 계산하여 리턴합니다.
pearson, kendall spearman 상관계수 세 가지를 구할 수 있으며, parameter 로 method = 'kendall' 과 같이 넣으면 됩니다. 디폴트는 pearson 입니다.
 
In
df = pd.DataFrame([(.2, .3), (.0, .6), (.6, .0), (.2, .1)], columns=['dogs', 'cats']) print(df) print(df.corr(method = 'pearson'))
Out
dogs cats 0 0.2 0.3 1 0.0 0.6 2 0.6 0.0 3 0.2 0.1 dogs cats dogs 1.000000 -0.851064 cats -0.851064 1.000000

Select and Slice

DataFrame에서 하나의 컬럼을 선택해보겠습니다. 예를 들어 'alcohol' 컬럼을 선택하고자 할 때, df.alcohol 또는 df['alcohol'] 형식으로 선택할 수 있습니다.
In
alcohol_col = df.alcohol alcohol_col = df['alcohol'] alcohol_col.head()
Out
0 14.23 1 13.20 2 13.16 3 14.37 4 13.24 Name: alcohol, dtype: float64
 

여러 columns 선택하기

DataFrame에서 여러 개의 컬럼을 선택해보겠습니다. 예를 들어 'alcohol', 'ash' 컬럼을 선택하고자 할 때, df[['alcohol', 'ash']] 형식으로 선택할 수 있습니다. 대괄호가 두 쌍이라는 점에 주의하세요.
In
selected_cols = df[['alcohol', 'ash']] selected_cols.head()
Out
alcohol ash 0 14.23 2.43 1 13.20 2.14 2 13.16 2.67 3 14.37 2.50 4 13.24 2.87

index selection

DataFrame을 index를 이용해 선택하고 싶을 때, df[10] 와 같이 선택하면 에러가 납니다. 하지만 아래와 같이 index 범위를 이용하면 index를 한 번에 선택할 수 있습니다.
In
df[10:15]
Out
alcohol malic_acid ash alcalinity_of_ash magnesium total_phenols \ 10 14.10 2.16 2.30 18.0 105 2.95 11 14.12 1.48 2.32 16.8 95 2.20 12 13.75 1.73 2.41 16.0 89 2.60 13 14.75 1.73 2.39 11.4 91 3.10 14 14.38 1.87 2.38 12.0 102 3.30 flavanoids nonflavanoid_phenols proanthocyanins color_intensity hue \ 10 3.32 0.22 2.38 5.75 1.25 11 2.43 0.26 1.57 5.00 1.17 12 2.76 0.29 1.81 5.60 1.15 13 3.69 0.43 2.81 5.40 1.25 14 3.64 0.29 2.96 7.50 1.20 od280/od315_of_diluted_wines proline target 10 3.17 1510 0 11 2.82 1280 0 12 2.90 1320 0 13 2.73 1150 0 14 3.00 1547 0
 
하나의 index를 선택하려면, .loc[ ] 을 통해 선택할 수 있습니다.
In
df.loc[10]
Out
alcohol 14.10 malic_acid 2.16 ash 2.30 alcalinity_of_ash 18.00 magnesium 105.00 total_phenols 2.95 flavanoids 3.32 nonflavanoid_phenols 0.22 proanthocyanins 2.38 color_intensity 5.75 hue 1.25 od280/od315_of_diluted_wines 3.17 proline 1510.00 target 0.00 Name: 10, dtype: float64
 
.loc[ ] 에서 [ ] 안에 들어가는 값은 숫자뿐만 아니라, DataFrame을 선언할 때 직접 지정한 index를 넣을 수도 있습니다. 우선 아래와 같이 index를 직접 설정한 DataFrame을 선언합니다.
In
# dictionary of lists dict = {'item':["apple", "banana", "orange", "avocado"], 'grade': ["A", "A", "B", "C"], 'price':[1500, 3000, 4000, 2000]} # index 직접 지정 fruit_df = pd.DataFrame(dict, index = ['001', '002', '003', '004']) fruit_df
Out
item grade price 001 apple A 1500 002 banana A 3000 003 orange B 4000 004 avocado C 2000
그 후 fruit_df.loc['003'] 으로 특정 row를 선택할 수 있습니다.
In
# accessing a dataframe using .loc[] function print(fruit_df.loc['003'])
Out
item orange grade B price 4000 Name: 003, dtype: object

index와 column을 한번에 선택

index와 column을 한번에 선택할 수도 있습니다.
In
df.loc[10:15, ['alcohol', 'ash']]
Out
alcohol ash 10 14.10 2.30 11 14.12 2.32 12 13.75 2.41 13 14.75 2.39 14 14.38 2.38 15 13.63 2.70

Boolean Indexing

Boolean Indexing은 조건에 따른 True, False 값을 통해 원하는 행을 추출하는 방법입니다.

한 column에 조건 추가

In
# 맨 위의 5행만을 출력하기 위해 head() 함수 사용 (df['alcohol'] > 14).head()
Out
0 True 1 False 2 False 3 True 4 False Name: alcohol, dtype: bool
df의 'alcohol' 컬럼 값이 14보다 크면 True, 작거나 같으면 False가 출력됩니다.
 

조건을 만족하는 행만 추출

In
df[df['alcohol']>14]
위에서 df['alcohol']>14 를 출력했을 때 True와 False 로 출력되는 것을 보았습니다. 따라서 df[df['alcohol']>14] 를 하면, df[조건이 True인 행] 만을 출력하게 됩니다.
 
Out
notion imagenotion image
 

원하는 value 값이 있는 행만 추출

isin() 함수를 사용하여 원하는 value 값이 있는 행만 추출할 수 있습니다. df['alcohol'] 컬럼값에 14.23, 14.20, 14.22 가 포함된 행만을 출력합니다.
In
isin_row = df['alcohol'].isin([14.23, 14.20, 14.22]) df[isin_row]
Out
notion imagenotion image
 
isin() 함수의 return 값은 조건이 참인지 거짓인지에 대한 정보를 담은 DataFrame입니다. isin() 함수의 parameter 로는 iterable(반복 가능한 객체로, list, dict, set, str, bytes, tuple, range 등), Series, DataFrame, dict가 들어갈 수 있습니다. 아래에서는 list 를 list() 의 parameter 로 넣은 예시를 다뤄보겠습니다.
In
isin_row = df['alcohol'].isin([14.23, 14.20, 14.22]) print(isin_row)
isin() 함수는 df['alcohol'] 컬럼 값을 확인하면서 parameter로 넣어준 14.23 또는 14.20 또는 14.22가 있는지를 판단합니다. 그 결과를 True 또는 False로 return 합니다.
 
Out
0 True 1 False 2 False 3 False 4 False 5 True 6 False 7 False 8 False 9 False ...
 

Pandas Math

Pandas를 이용한 수학 함수에 대해 알아봅시다.

df.mean()

df.mean() 함수는 DataFrame 의 각 컬럼 값의 mean(평균) 값을 return합니다. 만약 각 row 값의 mean 값을 얻고 싶다면 parameter 로 axis = 1 을 넣으면 됩니다.
In
# default axis = 0 df.mean()
Out
alcohol 13.000618 malic_acid 2.336348 ash 2.366517 alcalinity_of_ash 19.494944 magnesium 99.741573 total_phenols 2.295112 flavanoids 2.029270 nonflavanoid_phenols 0.361854 proanthocyanins 1.590899 color_intensity 5.058090 hue 0.957449 od280/od315_of_diluted_wines 2.611685 proline 746.893258 target 0.938202 dtype: float64
 
In
# 각 row 값의 mean 구하기 df.mean(axis = 1)
Out
0 88.928571 1 85.292857 2 95.844286 3 117.892143 4 64.906429 5 115.373571 6 102.604286 7 104.912857 8 85.130000 9 85.461429 10 119.328571 11 101.797857 12 104.285714 13 92.191429 ...

df.median()

중앙값(median) 은 데이터들을 크기 순서대로 정렬했을 때 가장 중앙에 있는 값입니다. 예를 들어 1, 3, 15, 20, 230의 다섯 값이 있을 때, 15가 가장 중앙에 있기 때문에 15가 median입니다. 데이터에 극단적인 값이 섞여있을 때 평균값보다 중앙값이 유용합니다.
 
df.median() 함수는 DataFrame 의 각 컬럼 값의 median값을 return합니다. 만약 각 row의 median 값을 얻고 싶다면 parameter 로 axis = 1 을 넣으면 됩니다.
In
df.median()
Out
alcohol 13.050 malic_acid 1.865 ash 2.360 alcalinity_of_ash 19.500 magnesium 98.000 total_phenols 2.355 flavanoids 2.135 nonflavanoid_phenols 0.340 proanthocyanins 1.555 color_intensity 4.690 hue 0.965 od280/od315_of_diluted_wines 2.780 proline 673.500 target 1.000 dtype: float64
 

DataFrame에 원하는 수학 함수 적용하기

df.mean() 이나 df.median()과 같이 기존에 정의된 함수 말고도 직접 만든 함수를 DataFrame에 적용할 수 있습니다. 우선 lambda 를 이용해 간단히 함수를 만드는 방법부터 배워봅시다.

lambda 사용법

파이썬은 lambda 함수라는 기능을 제공하는데, 일반 함수와는 다르게 이름이 따로 없고 런타임에 생성해서 사용할 수 있는 함수입니다. lambda 함수는 보통 한 줄로 표현할 수 있는 간단한 함수입니다. 예시를 통해 lambda 사용법을 알아봅시다.
 
아래와 같이 x와 y의 곱을 리턴하는 함수를 정의했습니다. 이 함수를 lambda 함수로 바꾸어봅시다.
def multiply(x, y): return x * y
 
lambda 뒤에는 함수의 parameter를,
: 뒤에는 리턴할 연산을 작성합니다.
r = lambda x, y : x*y r(3, 4) # OUTPUT : 12 # 또는 (lambda x, y : x*y)(3,4) # OUTPUT : 12
 

df.apply()

직접 만든 함수를 df.apply() 를 이용해 DaraFrame에 대해 적용할 수 있습니다. df.apply() 는 DataFrame의 column 또는 row 에 대하여 함수를 적용합니다. 함수에 전달되는 parameter는 Series object로, DataFrame의 column(axis=0) 이거나 row(axis=1)입니다. 디폴트는 axis = 0입니다.
 
In
df.apply(lambda x: x.max() - x.min())
각 column에 속하는 값에 대해 최대값과 최소값의 차이를 구하는 식을 만들어 적용해보았습니다.
Out
alcohol 3.80 malic_acid 5.06 ash 1.87 alcalinity_of_ash 19.40 magnesium 92.00 total_phenols 2.90 flavanoids 4.74 nonflavanoid_phenols 0.53 proanthocyanins 3.17 color_intensity 11.72 hue 1.23 od280/od315_of_diluted_wines 2.73 proline 1402.00 target 2.00 dtype: float64
 
df.apply() 의 parameter로 직접 만든 수식이 아니라 기존에 있는 함수를 넣을 수도 있습니다. 각 column 값들의 합을 구하는 np.sum 함수를 넣어보겠습니다.
In
df.apply(np.sum, axis = 0)
Out
alcohol 2314.110000 malic_acid 415.870000 ash 421.240000 alcalinity_of_ash 3470.100000 magnesium 17754.000000 total_phenols 408.530000 flavanoids 361.210000 nonflavanoid_phenols 64.410000 proanthocyanins 283.180000 color_intensity 900.339999 hue 170.426000 od280/od315_of_diluted_wines 464.880000 proline 132947.000000 target 167.000000 dtype: float64

Concatenate DataFrames

DataFrames를 나누고 합치는 방법에 대해 알아봅시다.

첫 번째 DataFrame 선택하기

In
first_group = df[10:15] first_group
Out
notion imagenotion image

두 번째 DataFrame 선택하기

In
sec_group = df[20:25] sec_group
Out
notion imagenotion image

두 DataFrames 합치기

In
pd.concat([first_group, sec_group])
Out
notion imagenotion image
 

Process DataFrame

NaN 값 처리 방법 및 Column 명을 바꾸는 방법에 대해 알아봅시다.

NaN값 처리

데이터를 다루다 보면 채워지지 않은 데이터, NaN 값을 마주치게 됩니다. NaN은 Not a Number, 즉 값이 없음(missing value)을 뜻합니다. 이 missing values를 처리하는 여러가지 방법을 알아보겠습니다.
 

missing value가 포함된 DataFrame 생성

In
df2 = pd.DataFrame({"name": ['Alfred', 'Batman', 'Catwoman'], "toy": [np.nan, 'Batmobile', 'Bullwhip'], "born": [pd.NaT, pd.Timestamp("1940-04-25"), pd.NaT]}) df2
여기에서 NaT는 날짜와 시각을 나타내는 datetime 타입의 값이 missing value일 경우를 표현합니다.
Out
name toy born 0 Alfred NaN NaT 1 Batman Batmobile 1940-04-25 2 Catwoman Bullwhip NaT

missing value가 포함된 row 를 없애기

df.dropna() 를 이용해 적어도 하나의 missing value 를 포함하고 있는 row 를 없앱니다.
In
df2.dropna()
Out
name toy born 1 Batman Batmobile 1940-04-25

모든 요소가 missing value인 row 를 없애기

df.dropna(how='all') 을 이용해 모든 요소가 missing value인 row 를 없앨 수 있습니다.
In
df2.dropna(how = 'all')
Out
name toy born 0 Alfred NaN NaT 1 Batman Batmobile 1940-04-25 2 Catwoman Bullwhip NaT
 

특정 컬럼에 missing value가 있는 row 를 없애기

In
df.dropna(subset=['name', 'born'])
DataFrame의 'name' 또는 'born' 컬럼에 missing value가 있다면 그 row 를 없애는 예제입니다.
Out
name toy born 1 Batman Batmobile 1940-04-25
 

NaN 값을 사용자가 지정한 값으로 치환하기

먼저 nan 값이 포함된 새로운 DataFrame을 생성합니다.
In
df = pd.DataFrame([[np.nan, 2, np.nan, 0], [3, 4, np.nan, 1], [np.nan, np.nan, np.nan, 5], [np.nan, 3, np.nan, 4]], columns=list('ABCD')) df
Out
A B C D 0 NaN 2.0 NaN 0 1 3.0 4.0 NaN 1 2 NaN NaN NaN 5 3 NaN 3.0 NaN 4
 
그다음 df.fillna() 를 이용해 NaN 값을 0으로 치환합니다.
In
# value: NaN 값들을 0으로 치환한다. inplace: df 내부에 실행한다. df.fillna(value = 0, inplace = True) df
Out
A B C D 0 0.0 2.0 0.0 0 1 3.0 4.0 0.0 1 2 0.0 0.0 0.0 5 3 0.0 3.0 0.0 4
 

NaN 값을 mean 으로 치환하기

앞서 배운 df.mean() 함수를 사용하여 mean 값을 구한 후 이 mean 값으로 nan 값을 치환할 수도 있습니다.
In
mean = df['B'].mean() mean_filled = df['B'].fillna(value = mean) mean_filled
df['B'] 는 [2.0 4.0 NaN 3.0] 으로 이루어져 있는 컬럼입니다. 따라서 mean 값은 3.0이고 이 mean 값이 NaN에 들어가게 됩니다.
Out
0 2.0 1 4.0 2 3.0 3 3.0 Name: B, dtype: float64

Column명 바꾸기

df.rename() 을 통해 DataFrame의 'alcohol' 컬럼 이름을 'ALCOHOL' 로 바꿔보겠습니다.
In
renamed = df.rename(columns={'alcohol' : 'ALCOHOL'}) renamed.head()
Out
notion imagenotion image

Pandas for Machine Learning

왜 shuffling을 해야 하는가?

데이터를 섞는 이유는 편차를 줄이면서, 모델이 더 보편적이면서 오버핏이 덜 되도록 하기 위함입니다. 여러분이 반드시 데이터를 섞어야 하는 경우는 여러분의 데이터가 클래스 또는 타겟 기준으로 정렬되어 있을 때입니다. 이 때, 여러분은 당신의 training/test/validation sets가 전반적인 데이터의 분포를 대표한다는 것을 확실히 하기 위해 데이터를 섞고 싶을 것입니다.
 
Batch gradient descent를 위해서도 동일한 논리가 적용됩니다. Batch gradient descent에 사용되는 아이디어는 하나의 single batch에 대한 경사를 계산함으로써, 여러분이 "실제" 경사를 잘 예측할 수 있다는 것입니다. 이 방법으로 여러분은 매번 모든 데이터셋에 대한 "실제" 경사를 구하지 않음으로써 계산 시간을 아낄 수 있습니다.
 
여러분이 배치를 생성할 때 그 배치가 전체 데이터셋을 대표하는 데이터가 아닐 수도 있다는 위험 때문에, 데이터를 각각의 epoch마다 섞고 싶을 것입니다. 각각의 epoch가 끝난 뒤마다 데이터를 섞으면, 여러분이 너무 많은 '나쁜' 배치에 고착되지 않을 수 있습니다.
 
그럼 이제 pandas 를 이용해 데이터를 섞어볼까요?

DataFrame 을 row 기준으로 random하게 섞기

DataFrame을 무작위로 섞을 때 df.sample() 함수를 사용합니다. 여기서 frac = 1 이라는 파라미터를 넣어주었는데 frac에 들어갈 값은 [0, 1] 범위의 실수값으로, 전체 데이터에서 몇%의 row를 리턴할지를 나타냅니다. frac = 1 을 넣으면 무작위로 섞인 DataFrame 전체가 리턴되고, frac = 0.5 를 넣으면 전체 DataFrame의 절반의 행만 리턴됩니다.
In
rand_df = df.sample(frac = 1) rand_df.head()
Out
notion imagenotion image
 
DataFrame의 전체 row 수가 177개이므로, frac = 0.05 를 하면 무작위로 섞인 9개의 row가 리턴됩니다.
In
rand_df = df.sample(frac = 0.05) rand_df
Out
notion imagenotion image
 
간단히 df.sample(n = 5) 를 이용해, 무작위로 5개의 row를 리턴할 수도 있습니다.
In
rand_df = df.sample(n=5) rand_df
Out
notion imagenotion image
 

df.reset_index()

df.reset_index() 를 이용해, 섞은 데이터에 index를 0부터 시작하여 새로 부여할 수도 있습니다. 파라미터로 drop = True 를 넣으면 원래의 index를 숨깁니다.
In
rand_df = df.sample(frac = 0.05).reset_index(drop = True) rand_df
Out
notion imagenotion image
 
df.reset_index() 의 파라미터로 drop = False 를 넣으면, 섞은 데이터에 index를 0부터 시작하여 새로 부여하면서, 섞기 전 원래의 index를 첫 번째 컬럼에서 보여줍니다.
In
rand_df = df.sample(frac = 0.05).reset_index(drop = False) rand_df
Out
notion imagenotion image

섞은 DataFrame 을 다시 순서대로 재배열

섞었던 DataFrame을 index 순서대로 재배열하기 위해 df.sort_index() 함수를 이용할 수 있습니다. 이때, df.sort_index()는 섞기 전 원래의 DataFrame을 복구하는 것이 아니라 index 순서대로 정렬하는 것이기 때문에, df.reset_index() 를 사용해 index를 새로 부여했다면 이 index 순서 그대로 리턴됩니다.
In
# 무작위로 5개의 row 추출하기 rand_df = df.sample(n=5) rand_df
Out
alcohol malic_acid ash alcalinity_of_ash magnesium total_phenols \ 61 12.64 1.36 2.02 16.8 100 2.02 175 13.27 4.28 2.26 20.0 120 1.59 94 11.62 1.99 2.28 18.0 98 3.02 48 14.10 2.02 2.40 18.8 103 2.75 158 14.34 1.68 2.70 25.0 98 2.80 flavanoids nonflavanoid_phenols proanthocyanins color_intensity hue \ 61 1.41 0.53 0.62 5.75 0.98 175 0.69 0.43 1.35 10.20 0.59 94 2.26 0.17 1.35 3.25 1.16 48 2.92 0.32 2.38 6.20 1.07 158 1.31 0.53 2.70 13.00 0.57 od280/od315_of_diluted_wines proline target 61 1.59 450 1 175 1.56 835 2 94 2.96 345 1 48 2.75 1060 0 158 1.96 660 2
 
In
# 추출한 row를 index 기준으로 정렬하기 sorted_df = rand_df.sort_index() sorted_df.head()
Out
alcohol malic_acid ash alcalinity_of_ash magnesium total_phenols \ 48 14.10 2.02 2.40 18.8 103 2.75 61 12.64 1.36 2.02 16.8 100 2.02 94 11.62 1.99 2.28 18.0 98 3.02 158 14.34 1.68 2.70 25.0 98 2.80 175 13.27 4.28 2.26 20.0 120 1.59 flavanoids nonflavanoid_phenols proanthocyanins color_intensity hue \ 48 2.92 0.32 2.38 6.20 1.07 61 1.41 0.53 0.62 5.75 0.98 94 2.26 0.17 1.35 3.25 1.16 158 1.31 0.53 2.70 13.00 0.57 175 0.69 0.43 1.35 10.20 0.59 od280/od315_of_diluted_wines proline target 48 2.75 1060 0 61 1.59 450 1 94 2.96 345 1 158 1.96 660 2 175 1.56 835 2