<jupyter_start><jupyter_text>Google Colab 사용 방법- 방향키 ↑↓: 셀 간 이동- Enter: 편집모드- Ctrl + Enter: 셀 실행- Shift + Enter: 셀 실행 + 다음 셀 선택---- Ctrl +M D: 셀 삭제- Ctrl + M K: 셀 위로 이동- Ctrl + M J: 셀 아래로 이동 ![alt text](https://hackernoon.com/hn-images/0*Xhz01Vby2rg86xZj)  1. PandasPandas는 다음과 같은 특징을 같습니다.- NumPy를 내부적으로 활용함(NumPy의 특징을 그대로 가짐)- 데이터분석에 특화된 데이터 구조 제공- 다양한 데이터 분석 함수 제공- 데이터베이스에 쉽게 연결 가능 Cheat Sheet판다스는 많은 기능을 제공합니다. 이번 강의에서는 이러한 기능들을 학습할 예정입니다.그러나 이 모든 기능을 외울 순 없습니다. 외울 필요도 없고요.**아래는 판다스를 한 장에 정리해 둔 치트시트입니다**어떠한 기능들을 하는 함수들이 있다는것만 학습한 뒤 해당 기능이 필요할 때 아래의 치트시트를 참조해가며 판다스를 사용하면 됩니다. ![](http://drive.google.com/uc?export=view&id=12qAWxrdhFmdYN61uYbqM58jHm1y9PWJ3) 파이썬에서 pandas를 사용할 때는 일반적으로 다음과 같이 pd형태로 임포트해서 사용합니다<jupyter_code>import pandas as pd
# numpy와 matplotlib 임포트
# %matplotlib inline # 노트북에서 그래프를 보여주기 위해 추가해주는 코드
import numpy as np
import matplotlib.pyplot as plt<jupyter_output><empty_output><jupyter_text>Pandas의 모든 API는 help 함수를 이용하여 도움말을 확인할 수 있습니다.<jupyter_code># help(pd)
# help(pd.read_csv)
help(pd.DataFrame)
# pd.DataFrame?<jupyter_output><empty_output><jupyter_text>2. Pandas 데이터 구조 ![](http://drive.google.com/uc?export=view&id=1B0ZpHC2hCXfoeYKxMT4DRHqKrQbEbztj) Series- 1차원 데이터 구조- 일반적으로 s 또는 sr로 이름 붙임![](http://drive.google.com/uc?export=view&id=1msqZqjnrFLJXlaBGF7DsLf2B0_lA_J07)Series는 **pd.Series()** 로 생성합니다.<jupyter_code>s = pd.Series([3, -5, 7, 4]) # 인덱스 없이 생성
s<jupyter_output><empty_output><jupyter_text>인덱스를 특별히 지정해주지 않으면 NumPy 다차원배열처럼 0부터 인덱스가 시작됩니다.NumPy 다차원 배열과 다르게 Pandas Series는 인덱스를 지정해 줄 수 있으며 숫자가 아닌 문자열도 인덱스가 될 수 있습니다.<jupyter_code>s = pd.Series([3, -5, 7, 4], index=['a', 'b', 'c', 'd'])
s<jupyter_output><empty_output><jupyter_text>**type()**을 통해 데이터타입이 Series인 걸 확인할 수 있습니다.<jupyter_code>type(s)<jupyter_output><empty_output><jupyter_text>속성 Series는 index와 values를 가집니다.<jupyter_code>s.index
s.values<jupyter_output><empty_output><jupyter_text>인덱싱 Series는 요소는 index명 또는 index의 순서를 통해 인덱싱할 수 있습니다.<jupyter_code># index명으로 조회
s['a']
# index순서로 조회
s[0]<jupyter_output><empty_output><jupyter_text>파이썬 딕셔너리와 Pandas Series의 공통점, 차이점 Index와 value를 가진다는 점에서 key와 value를 가지는 파이썬 딕셔너리와 유사하다 볼 수 있습니다.그렇기에 파이썬 딕셔너리를 통해 Series를 생성할 수 있습니다.<jupyter_code># pop_dict는 파이썬 딕셔너리
pop_dict = {'Germany': 81.3, 
            'Belgium': 11.3, 
            'France': 64.3, 
            'United Kingdom': 64.9, 
            'Netherlands': 16.9}

# pop_dict로 Series 생성
population = pd.Series(pop_dict)
population<jupyter_output><empty_output><jupyter_text>딕셔너리에서 key값을 이용해 value를 조회하듯 Series에서 index를 이용해 value를 조회할 수 있습니다.<jupyter_code>pop_dict['France']
population['France']<jupyter_output><empty_output><jupyter_text>딕셔너리와 Series의 차이점은, 딕셔너리의 Key는 순서가 없고 pandas Series의 index는 순서가 있다는 점입니다.그렇기에 Series는 index의 순서를 통해서도 value 조회가 가능합니다.<jupyter_code># KeyError 발생(2라는 Key 값은 없음)
pop_dict[2]
population[2]<jupyter_output><empty_output><jupyter_text>또한 Series는 딕셔너리와 다르게 아래와 같은 연산이 가능합니다.<jupyter_code>population*1000
# TypeError발생 (dict * int)
pop_dict * 1000<jupyter_output><empty_output><jupyter_text>참고. Index가 문자열에 저장된 숫자일 경우Series의 요소를 조회하는데 혼돈이 올 수 있으니 숫자 Index를 원할 경우,- 문자가 아닌 정수형으로 index를 지정합시다.- 1이 아닌 0부터 index를 지정합시다.<jupyter_code>sr = pd.Series([1, 2, 3, 4], index=['1', '2', '3', '4'])
# index명으로 접근
sr['1']
# index순서로 접근
sr[1]<jupyter_output><empty_output><jupyter_text>DataFrame에서도 마찬가지로 숫자 Index를 사용할 경우 염두해두어야 합니다.  DataFrame- 2차원 데이터 구조- 일반적으로 df로 이름 붙임- 엑셀 스프레드시트, 데이터베이스등과 동일한 2차원 구조- 가장 많이 활용하게될 구조- Series가 합쳐진 형태![](http://drive.google.com/uc?export=view&id=1lixriaQy119N0nNM0e_TTQ1DfuSNMk76)DataFrame은 **pd.DataFrame()** 으로 생성합니다. 중첩된 리스트나 딕셔너리를 통해 DataFrame을 생성할 수 있습니다.<jupyter_code># 중첩된 리스트를 통한 데이터 생성
# 각 행을 리스트로 만들어야 함
data = [['Belgium', 'Brussels', 11190846],
        ['India', 'New Delhi', 1303171035],
        ['Brazil', 'Brasília', 207847528]]

df = pd.DataFrame(data)

df<jupyter_output><empty_output><jupyter_text>columns 파라메터를 통해 칼럼명 역시 정해줄 수 있습니다.<jupyter_code># 중첩된 리스트를 통한 데이터 생성
# 각 행을 리스트로 만들어야 함
data = [['Belgium', 'Brussels', 11190846],
        ['India', 'New Delhi', 1303171035],
        ['Brazil', 'Brasília', 207847528]]

df = pd.DataFrame(data, columns=['Country', 'Capital', 'Population'])

df<jupyter_output><empty_output><jupyter_text>데이터프레임의 데이터는 딕셔너리로 넘겨주는게 일반적입니다.- 칼럼명을 함께 넘겨줄 수 있기 때문입니다.- **동일한 데이터타입끼리 함께 묶어서 넘겨줄 수 있기 때문입니다.**<jupyter_code>data = {'Country': ['Belgium', 'India', 'Brazil'],
        'Capital': ['Brussels', 'New Delhi', 'Brasília'],
        'Population': [11190846, 1303171035, 207847528]}

df = pd.DataFrame(data)

df<jupyter_output><empty_output><jupyter_text>칼럼명과 마찬가지로 인덱스 역시 변경할 수 있습니다.<jupyter_code>data = {'Country': ['Belgium', 'India', 'Brazil'],
        'Capital': ['Brussels', 'New Delhi', 'Brasília'],
        'Population': [11190846, 1303171035, 207847528]}

df_2 = pd.DataFrame(data,
                    index=['aa', 'bb', 'cc'])

df_2<jupyter_output><empty_output><jupyter_text>**type()**을 통해 데이터타입이 DataFrame인 걸 확인할 수 있습니다.<jupyter_code>type(df)<jupyter_output><empty_output><jupyter_text>데이터프레임의 하나의 열은 어떤 데이터구조로 되어있을까요?<jupyter_code>type(df['Country'])
df.Country<jupyter_output><empty_output><jupyter_text>데이터프레임 각 열의 데이터타입은 Series라는걸 알 수 있습니다.  속성아래와 같은 속성을 가집니다.- index- columns- dtypes- values<jupyter_code>df.index
df.columns
df.dtypes
df.values<jupyter_output><empty_output><jupyter_text>Index, columns, dtypes를 한번에 조회하고 싶다면 info()를 사용하세요.<jupyter_code>df.info()<jupyter_output><empty_output><jupyter_text>특정한 칼럼을 index로 사용할수도 있습니다.<jupyter_code>df
df_index_with_country = df.set_index('Country')

df_index_with_country<jupyter_output><empty_output><jupyter_text>하나의 인덱스만 가능한것은 아닙니다. DataFrame은 여러개의 인덱스를 가질 수 있습니다.<jupyter_code>df_index_with_country_and_capital = df.set_index(['Country', 'Capital'])

df_index_with_country_and_capital
# 인덱싱
df_index_with_country_and_capital.loc[['Belgium', 'Brusseles']]<jupyter_output><empty_output><jupyter_text>Dataframe의 column은 어떤 데이터타입일까기존에 학습한 데이터프레임 생성 방식은 아래처럼 모든 데이터를 직접 명시해주는 것이었습니다.아래 코드는 각 열을 파이썬의 리스트 형태로 입력하는 방식입니다.리스트 형태로 입력된 데이터를 기반으로 판다스가 Series를 만들고 Series들로 DataFrame을 만드는 것이죠.<jupyter_code>data = {'col1': [1, 2, 3, 4],
        'col2': [5, 6, 7, 8],
        'col3': [9, 10, 11, 12]}

df_3 = pd.DataFrame(data, 
                    index=['A', 'B', 'C', 'D'])

df_3<jupyter_output><empty_output><jupyter_text>![](http://drive.google.com/uc?export=view&id=1vXLOGcypyLgT12DGNIGTnmna8BIW1pvK) 파이썬 리스트가 아닌 Series를 통해서도 DataFrame을 생성할 수 있습니다.<jupyter_code>s_1 = pd.Series([1, 2, 3, 4], index=['A', 'B', 'C', 'D'])
s_2 = pd.Series([5, 6, 7, 8], index=['A', 'B', 'C', 'D'])
s_3 = pd.Series([9, 10, 11, 12], index=['A', 'B', 'C', 'D'])

data = {'col1': s_1,
        'col2': s_2,
        'col3': s_3}

df_4 = pd.DataFrame(data, index=['A', 'B', 'C', 'D'])

df_4<jupyter_output><empty_output><jupyter_text>NumPy ndarray와 비교  공통점NumPy 다차원배열처럼 많은 연산들이 요소들간에 이루어집니다.(Elementwise-operation)<jupyter_code>s
s + 10
df
df['Population'] / 1000
df['Country'] + df['Capital']<jupyter_output><empty_output><jupyter_text>차이점Series간 연산을 하는 경우, index를 기반으로 이루어집니다. (모든 NumPy 다차원배열은 shape가 동일하다면 index도 동일하기에 index가 달라 연산이 이루어지지 않는 경우는 없음.)<jupyter_code>s
s1 = s[['a', 'b']]
s2 = s[['b', 'c']]
s1
s2
s1 + s2<jupyter_output><empty_output><jupyter_text>실습<jupyter_code>df_index_with_country<jupyter_output><empty_output><jupyter_text>EXERCISE: df_index_with_country이 데이터로 주어졌을때 각 국가의 수도 인구는 벨기에 수도 인구 대비 몇 배인지 구하세요.<jupyter_code>df_index_with_country[?] / df_index_with_country[?][?]<jupyter_output><empty_output><jupyter_text>3. Pandas Importing/Exproting직접 데이터를 입력하여 DataFrame이나 Series를 생성할 일은 실무에서 많지 않습니다.실무에서는 이미 데이터가 존재하는 경우가 많고 그 데이터를 판다스로 importing해서 분석을 진행합니다.CSV나 엑셀 형태의 파일로 저장된 데이터를 판다스로 가져오거나 직접 데이터베이스에 연결해서 데이터를 가져와서 작업하는 경우가 일반적입니다.pandas가 지원하는 Importing/Exporting 포맷은 아래와 같습니다.- csv (모든 text파일 연결에 사용)- excel- sql (모든 데이터베이스 연결에 사용)- hdf5- json- html- pickle- ... Importing 함수의 경우 **pd.read** 형태를 가지며 Exporting 함수의 경우 **df.to** 형태를 가집니다.예시) json의 경우<jupyter_code>json_data = df.to_json()
json_data
pd.read_json(json_data)<jupyter_output><empty_output><jupyter_text>1) CSV하나의 파일로 관리 가능한 크기의 데이터라면, 데이터를 파일로 저장할때 일반적으로 CSV포맷을 활용합니다.CSV는 comma-separated values의 약자이며 값들을 ,로 구분합니다.  Importing<jupyter_code># 파일다운로드 받기
!wget -O 'iris_sample.csv' https://raw.githubusercontent.com/duc-ke/edu_jupyter_pandas/master/dataset/iris_sample.csv
df_iris_sample = pd.read_csv('iris_sample.csv')
df_iris_sample<jupyter_output><empty_output><jupyter_text>csv뿐만 아니라 tsv, txt도 read_csv()파일을 통해 읽어올 수 있습니다.파일 관점에서 보면 csv, tsv, txt는 동일합니다. csv, tsv역시 txt파일이며 값을 구분하는 구분자가 콤마냐 탭이냐의 차이입니다.  txt<jupyter_code># 'iris_sample.txt' 로 확장자를 바꿔 파일다운로드 받기
!wget -O 'iris_sample.txt' https://raw.githubusercontent.com/duc-ke/edu_jupyter_pandas/master/dataset/iris_sample.csv
pd.read_csv('iris_sample.txt')<jupyter_output><empty_output><jupyter_text>tsvTSV는 tab-separated values의 약자이며 값들을 tab으로 구분합니다.<jupyter_code>!wget -O 'tsv_sample.tsv' https://gist.githubusercontent.com/mbostock/3305937/raw/a5be7c5fd55c4fa0ca8a400cb68d658a40989966/data.tsv
pd.read_csv('tsv_sample.tsv')
pd.read_csv('tsv_sample.tsv', sep='\t')<jupyter_output><empty_output><jupyter_text>Exportingcsv를 통해 생성한 df_iris_sample에서 첫 5행만 'iris_sample_2.csv'로 저장해봅시다<jupyter_code>df_iris_sample.head()
df_iris_sample_2 = df_iris_sample.head()
df_iris_sample_2
df_iris_sample_2.to_csv('iris_sample_2.csv')<jupyter_output><empty_output><jupyter_text>잘 저장되었는지 다시 확인해보겠습니다.<jupyter_code>pd.read_csv('iris_sample_2.csv')<jupyter_output><empty_output><jupyter_text>**Unnamed: 0** 라는 열이 들어가 있습니다. 이는 to_csv()시 index도 함께 파일에 저장되기에 생기는 문제입니다.저장시 index=False 를 통해 이 문제를 해결할 수 있습니다.<jupyter_code>df_iris_sample_2.to_csv('iris_sample_2_no_index.csv', index=False)
pd.read_csv('iris_sample_2_no_index.csv')<jupyter_output><empty_output><jupyter_text>txt, tsv도 동일한 to_csv()로 다룰 수 있습니다.  2) 엑셀엑셀파일은 read_excel(), to_excel() 을 활용해서 다룹니다.  입력<jupyter_code># 파일다운로드 받기
!wget -O '성적표.xlsx' https://www.dropbox.com/s/zubhmxf4aj9eg7y/%EC%84%B1%EC%A0%81%ED%91%9C.xlsx?dl=0
pd.read_excel('성적표.xlsx')<jupyter_output><empty_output><jupyter_text>기본적으로 read_excel()은 첫번째 시트를 가져옵니다. 위 코드는 sheet_name=0이 생략되어있으며 아래의 코드와 동일한 결과를 보입니다.<jupyter_code>pd.read_excel('성적표.xlsx', sheet_name=0)<jupyter_output><empty_output><jupyter_text>두 번째 시트를 가져오려면 sheet_name 파라메터에 1을 전달해야 합니다.<jupyter_code>pd.read_excel('성적표.xlsx', sheet_name=1)<jupyter_output><empty_output><jupyter_text>또는 시트의 이름을 명시해서 가져올수도 있습니다.<jupyter_code>pd.read_excel('성적표.xlsx', sheet_name='Sheet2')<jupyter_output><empty_output><jupyter_text>출력 to_excel()로 엑셀 파일 쓰기가 가능합니다.sheet_name 파라메터를 통해 시트명을 정할 수 있습니다.> to_excel()을 사용하기 위해선 ‘openpyxl’ 또는 ‘xlsxwriter’ 라이브러리가 필요합니다.<jupyter_code># xlsxwriter 라이브러리 설치
!pip install xlsxwriter
df_sheet2 = pd.read_excel('성적표.xlsx', sheet_name='Sheet2')

df_sheet2.to_excel('to_excel.xlsx', sheet_name='이름을 적어주세요')
# df_sheet2.to_excel('to_excel.xlsx', sheet_name='이름을 적어주세요', index=False)
pd.read_excel('to_excel.xlsx')<jupyter_output><empty_output><jupyter_text>3) 데이터베이스<jupyter_code>#  라이브러리 설치
!pip install mysql-connector-python
import sqlalchemy

user = "anonymous"
host = "ensembldb.ensembl.org"
port = 3337
database = "ailuropoda_melanoleuca_core_79_1"

url = f"mysql+mysqlconnector://{user}@{host}:{port}/{database}"
# url = f"mysql+mysqlconnector://{user}:{password}@{host}:{port}/{database}"

connection = sqlalchemy.create_engine(url)
pd.read_sql("select * from analysis limit 10", connection)<jupyter_output><empty_output><jupyter_text>4. 인덱싱/슬라이싱  0) [ ] - **[ ]** 연산자를 활용해 데이터를 가져올 수 있습니다.- 간단히 사용하기에는 좋지만 불규칙적이라 loc, iloc를 통한 인덱싱/슬라이싱을 추천합니다.<jupyter_code>df<jupyter_output><empty_output><jupyter_text>- 단일 칼럼 조회<jupyter_code>df['Country']<jupyter_output><empty_output><jupyter_text>- 복수 칼럼 조회<jupyter_code>df[['Country', 'Population']]<jupyter_output><empty_output><jupyter_text>- 슬라이싱  - **[ ]** 를 통한 슬라이싱은 row(행)에 적용됩니다.<jupyter_code># index 슬라이싱. 2 미포함
df[0:2]<jupyter_output><empty_output><jupyter_text>- 슬라이싱  - index로 슬라이싱 하지 않고 label로 슬라이싱 하는 경우, 마지막 라벨은 포함됩니다.<jupyter_code>data = {'Country': ['Belgium', 'India', 'Brazil'],
        'Capital': ['Brussels', 'New Delhi', 'Brasília'],
        'Population': [11190846, 1303171035, 207847528]}

df_2 = pd.DataFrame(data
                  , index=['aa', 'bb', 'cc']                  
                 )

df_2
# label 슬라이싱. 'cc' 포함
df_2['aa':'cc']<jupyter_output><empty_output><jupyter_text>1) 인덱싱- loc (Label based indexing)- iloc (Positional indexing)- ix (사용 권장하지 않음)<jupyter_code>df.iloc[0,0] # 위치를 통한 인덱싱
df.iat[0,0] # 위치를 통한 인덱싱
df.loc[0, 'Country'] # 라벨을 통한 인덱싱
df.at[0, 'Country'] # 라벨을 통한 인덱싱
df.ix[1, 'Capital'] # 위치/라벨을 통한 인덱싱 (사용하지 말것을 권장)
                    # 행은 위치, 열은 라벨을 통해 인덱싱<jupyter_output><empty_output><jupyter_text>2) 슬라이싱<jupyter_code>df.iloc[0:1,0:2] # 위치를 통한 슬라이싱 (끝은 미포함)
df.loc[0:1, 'Country':'Capital'] # 라벨을 통한 슬라이싱 (끝 포함)<jupyter_output><empty_output><jupyter_text>3) 불리언 인덱싱 (필터링)- 조건을 제시하고 조건이 True인 요소만을 조회하는 방식- 필터링이라고도 불리웁니다.<jupyter_code>df
df['Population'] > 200000000
df[df['Population'] > 200000000]<jupyter_output><empty_output><jupyter_text>실습<jupyter_code># dataframe
data = {'country': ['Belgium', 'France', 'Germany', 'Netherlands', 'United Kingdom'],
        'population': [11.3, 64.3, 81.3, 16.9, 64.9],
        'area': [30510, 671308, 357050, 41526, 244820],
        'capital': ['Brussels', 'Paris', 'Berlin', 'Amsterdam', 'London']}
countries = pd.DataFrame(data)
countries = countries.set_index('country') # 인덱스 지정
countries<jupyter_output><empty_output><jupyter_text>---    EXERCISE: 인구밀도를 의미하는 `density` 칼럼을 추가하세요. (주의: 현재 'population' 칼럼은 10만 단위로 표기되어 있습니다)<jupyter_code>countries['density'] = countries[?]*1000000 / countries[?]
countries<jupyter_output><empty_output><jupyter_text>EXERCISE: 인구밀도가 300을 초과하는 국가(country)의 수도(capital)과 인구(population)을 선택해주세요.<jupyter_code>countries.loc[countries[?] > 300, [?]]<jupyter_output><empty_output><jupyter_text>EXERCISE: 'density_ratio' 칼럼을 추가해주세요. (density_ratio = 인구밀도/평균 인구밀도)<jupyter_code>countries['density_ratio'] = 
countries<jupyter_output><empty_output><jupyter_text>EXERCISE: 영국(United Kingdom)의 수도(capital)를 'Cambridge'로 변경해주세요.<jupyter_code>countries.loc[?, ?] = 'Cambridge'
countries<jupyter_output><empty_output><jupyter_text>EXERCISE: 인구 밀도가 100 초과, 300 미만인 국가들을 표시해주세요.   --- - 스트링 다루는 법<jupyter_code>countries['capital'].str.len()<jupyter_output><empty_output><jupyter_text>---     EXERCISE: 수도가 7글자 이상인 국가들을 표시해주세요. (힌트: string의 len( )를 사용하세요.)     EXERCISE: 수도에 'am' 이 포함되는 국가들을 표시해주세요. (힌트: string의 contains( )를 사용하세요.)  5. 삭제  1) Row(행) 삭제- axis=0- axis의 기본 값이 0이니 생략 가능  단일 행 삭제<jupyter_code>df.drop(1)<jupyter_output><empty_output><jupyter_text>복수 행 삭제<jupyter_code>df.drop([0,1])<jupyter_output><empty_output><jupyter_text>2) Column(열) 삭제- axis=1  단일 열 삭제<jupyter_code>df.drop('Country', axis=1)<jupyter_output><empty_output><jupyter_text>복수 열 삭제<jupyter_code>df.drop(['Country', 'Population'], axis=1)<jupyter_output><empty_output><jupyter_text>참조. Series 삭제<jupyter_code>s
s.drop(['a', 'c'])
# s = s.drop(['a', 'c']) # 삭제한 결과를 사용하고 싶다면 다시 변수로 선언해주어야 한다
s<jupyter_output><empty_output><jupyter_text>6. Pandas 함수<jupyter_code>df<jupyter_output><empty_output><jupyter_text>데이터 탐색에 유용한 함수<jupyter_code>df.describe() # 숫자 열에만 적용. 숫자열의 통계값과 최대최소값등을 보여줌
df.head(2) # 초반 n행을 보여줌. default는 5
# df.head(n=2)
df.sort_values('Population') # 오름차순 정렬
df.sort_values('Population', ascending=False) # 내림차순 정렬
df.isnull() # null값이 있는지 확인
# column(열)별로 null값이 있는지 확인
df.isnull().any() # axis=0이 생략된 형태
# df.isnull().any(axis=0)
# row(행)별로 null값이 있는지 확인
df.isnull().any(axis=1)
# null값이 DataFrame내에 하나라도 있는지 확인
df.isnull().any().any()
df2 = df.copy()
df2
df2.loc[0, 'Population'] = None
df2
df2.isnull().any()<jupyter_output><empty_output><jupyter_text>aggregate 함수<jupyter_code>df.count()
df.sum()
df.min()
df.max()
df.mean() # 숫자 열에만 적용
df.median() # 숫자 열에만 적용<jupyter_output><empty_output><jupyter_text>실습<jupyter_code>!wget -O 'titles.csv' https://docs.google.com/spreadsheets/d/1fiioUPMRurfE523yWGaRF3ckO-TUHu1AaIAI6Eo7Ti8/export?format=csv
titles = pd.read_csv('titles.csv')
titles.head()<jupyter_output><empty_output><jupyter_text>EXERCISE: titles 데이터프레임에는 몇 개의 영화가 기록되어 있나요?     EXERCISE: titles에서 가장 빠른 시기에 제작된 영화 두 개를 표시하세요.     EXERCISE: 제목(title)이 "Hamlet"인 영화는 몇 개가 있나요?     EXERCISE: 제목(title)이 "Treasure Island"인 영화를 제작년도(year)의 오름차순에 따라 표시하세요. (df.sort_values())     EXERCISE: 1590년에서 1959년 사이 몇 개의 영화가 만들어졌나요?(1950 <= 제작년도 <= 1959)  7. apply 함수- apply함수는 요소별로 적용됨  하나의 요소를 활용하는 경우<jupyter_code>df.loc[:, 'Population':'Population']<jupyter_output><empty_output><jupyter_text>- 각 Population에 1씩 추가<jupyter_code>df.loc[:, 'Population':'Population'].apply(lambda x: x + 1)<jupyter_output><empty_output><jupyter_text>여러개의 요소를 활용하는 경우<jupyter_code>df.loc[:, 'Country':'Capital']<jupyter_output><empty_output><jupyter_text>칼럼명(Country, Capital)을 사용해도 되고 칼럼 위치(0, 1)를 사용해도 됩니다.<jupyter_code>df.loc[:, 'Country':'Capital'].apply(lambda x: x['Country'] + "'s capital is " + x['Capital'], axis=1)
df.loc[:, 'Country':'Capital'].apply(lambda x: x[0] + "'s capital is " + x[1], axis=1)<jupyter_output><empty_output><jupyter_text>8. GroupBy dataframe을 key값에 따라 나눈 뒤 각각에 특정한 함수를 적용한 뒤 다시 합치고 싶을때 사용합니다.groupby는 Split-Apply-Combine 단계를 거칩니다.- **Split**: Key값에 따라 나눈 뒤- **Apply**: 함수를 적용- **Combine**: 다시 합치기SQL의 **GROUP BY**와 유사합니다. ![alt text](https://github.com/jorisvandenbossche/pandas-tutorial/blob/master/img/splitApplyCombine.png?raw=true) 아래 데이터로 Groupby 예를 들어 보겠습니다.<jupyter_code>df = pd.DataFrame({'key':['A','B','C','A','B','C','A','B','C'],
                   'data': [0, 5, 10, 5, 10, 15, 10, 15, 20]})
df<jupyter_output><empty_output><jupyter_text>key값에 따라 data의 합을 구하고 싶다면 어떻게 해야 할까요?key값대로 불리언인덱싱을 한 후 sum()함수를 취해주면 됩니다.<jupyter_code>df['key'].unique()<jupyter_output><empty_output><jupyter_text>key는 'A', 'B', 'C' 이렇게 세 개가 있고 각각의 키값에 대해 불리언 인덱싱을 한 후 sum()해보겠습니다.<jupyter_code>df[df['key'] == "A"].sum()
df[df['key'] == "B"].sum()
df[df['key'] == "C"].sum()<jupyter_output><empty_output><jupyter_text>이 과정을 groupby를 사용하면 한번에 수행할 수 있습니다.<jupyter_code>df.groupby('key').sum()
# df.groupby('key').aggregate(np.sum)  # 'sum'<jupyter_output><empty_output><jupyter_text>실습<jupyter_code>df = pd.read_csv('https://raw.githubusercontent.com/jorisvandenbossche/pandas-tutorial/master/data/titanic.csv')
df.head()<jupyter_output><empty_output><jupyter_text>타이타닉 데이터셋을 df라는 판다스 데이터프레임으로 불러왔습니다. 이 데이터로 아래 실습을 진행해주세요.     EXERCISE: groupby()를 사용하여 각 성별(sex)의 평균 나이(age)를 구하세요.     EXERCISE: 전체 승객(passenger)의 평균 생존율을 구하세요.     EXERCISE: 25세 이하 승객의 생존율을 구하세요. (힌트: 불리언 인덱싱)     EXERCISE: 남성의 생존율을 구하세요. 여성의 생존율을 구하세요. (힌트: 불리언 인덱싱)     EXERCISE: 생존율을 구하는 함수가 작성되어 있습니다. 성별 생존율을 groupby를 활용해 구하기 위해 ?부분을 알맞게 채워주세요.<jupyter_code>def survival_ratio(survived):
    return survived.sum() / len(survived)
  
df.groupby(?)[?].aggregate(survival_ratio)<jupyter_output><empty_output><jupyter_text>EXERCISE: 'Pclass'별로 생존율을 보기 위해 bar 차트를 그리고자 합니다. ?부분을 알맞게 채워서 bar 차트를 그려주세요.<jupyter_code>df.groupby(?)[?].aggregate(survival_ratio).plot(kind='bar')<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.14687779472881266, 'fraction_numerical': 0.028828449681729706, 'mean_word_length': 5.950639853747715, 'pattern_counts': {'":': 0, '<': 303, '<?xml version=': 0, '>': 305, 'https://': 8, 'lorem ipsum': 0, 'www.': 1, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 2, 'word_list_counts': {'cursed_substrings.json': 1, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '75', 'dir': 'jupyter-structured-clean-dedup', 'id': '269771', 'license': 'MIT', 'n_tokens_mistral': 11417, 'n_tokens_neox': 12858, 'n_words': 1693, 'path': 'Python/pandas/0-Pandas.ipynb', 'repo_name': 'LyunJ/2021_K_Digital', 'size': '19009'}