반응형

1. pandas 라이브러리를 읽어들입니다.

>>> import pandas as pd

2. 다음 데이터로 3개의 딕셔너리 데이터셋을 만듭니다.

>>> raw_data_1 = { 'subject_id' : ['1', '2', '3', '4', '5'], 'first_name' : ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'], 'last_name' : ['Anderson', 'Ackerman', 'Ali', 'Aoni', 'Atiches']}
>>> raw_data_2 = {'subject_id' : ['4', '5', '6', '7', '8'], 'first_name' : ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'], 'last_name' : ['Bonder', 'Black', 'Balwner', 'Brice', 'Btisan']}
>>> raw_data_3 = {'subject_id' : ['1', '2', '3', '4', '5', '7', '8', '9', '10', '11'], 'test_id' : [51, 15, 61, 16, 14, 15, 1, 61, 16]}

3. data1, data2, data3라는 변수에 각각 할당합니다.

>>> data1 = pd.DataFrame(raw_data_1, columns = ['subject_id', 'first_name', 'last_name'])
>>> data2 = pd.DataFrame(raw_data_2, columns = ['subject_id', 'first_name', 'last_name'])
>>> data3 = pd.DataFrame(raw_data_3, columns = ['subject_id', 'test_id'])

4. 행을 따라 두 개의 dataframe을 결합하고 all_data 변수에 할당합니다.

>>> all_data = pd.concat([data1, data2])
>>> all_data

5. 컬럼에 따라 두개의 dataframe을 결합하고 all_data_col 변수에 할당합니다.

>>> all_data_col = pd.concat([data1, data2], axis = 1)
>>> all_data_col

6. data3을 출력합니다.

>>> data3

7. subject_id 값을 통해 all_data와 data3를 병합합니다.

>>> pd.merge(all_data, data3, on='subject_id') # on 인수를 통해 기준열을 명시했습니다

8. data1과 data2에 동일한 'subject_id'가 있는 데이터만 병합합니다.

>>> pd.merge(data1, data2, on='subject_id', how='inner') # how 인수를 통해 양쪽 데이터프레임 모두 키가 존재하는 데이터만 보여줍니다. how 인수로 명시하지 않아도 기본적으로 'inner'를 적용한 것으로 처리하기 때문에 양쪽 모두 존재하는 데이터만 보여줍니다.

9. data1과 data2의 키 값이 한쪽에만 있더라도 모든 값들을 병합합니다. 

>>> pd.merge(data1, data2, on='subject_id', how='outer') # 값이 없는 필드에는 NaN(Null 값)으로 표시합니다.

(Source : Pandas exercises 깃헙)

반응형
반응형

1. pandas 및 numpy 라이브러리를 읽어들입니다.

>>> import pandas as pd
>>> import numpy as np

2. csv_url이라는 변수에 http 주소를 저장합니다.

>>> csv_url = 'https://raw.githubusercontent.com/guipsamora/pandas_exercises/master/04_Apply/Students_Alcohol_Consumption/student-mat.csv'

3. 아래 주소에서 데이터셋을 읽어들이고, df이라는 변수에 할당합니다.

>>> df = pd.read_csv(csv_url)
>>> df.head() # df의 데이터셋의 구조를 알기 위해 상위 열(5)을 조회합니다.

4. 이 데이터프레임에서 'school' 컬럼에서 'guardian'컬럼까지 분할해서 stud_alcoh 변수에 할당합니다.

>>> stud_alcoh = df.loc[: , 'school':'guardian'] # loc는 행과 열을 인덱싱하는 속성이다. 먼저 전체 행을 선택하기 위해 : (콜론)을 입력하고, 열 중에서 'school'에서 'guardian'까지의 열을 선택했다.

*인덱싱:데이터프레임에서 특정한 데이터만 골라내는 것.

5. 문자열 중 첫 글자를 대문자로 만드는 lambda 함수를 만듭니다.

>>> capitalizer = lamda x: x.capitalize() # capitalize() 메서드는 첫글자를 대문자로 전환합니다.

6. Mjob컬럼과 Fjob컬럼 값들의 첫 글자를 모두 대문자로 만듭니다.

>>> stud_alcoh['Mjob'].apply(capitalizer) # 커스텀 함수인 capitalizer를 데이터프레임의 'Mjob'컬럼에 적용하기 위해 apply 메서드를 적용합니다.
>>> stud_alcoh['Fjob'].apply(capitalizer) # 커스텀 함수인 capitalizer를 데이터프레임의 'Fjob'컬럼에 적용하기 위해 apply 메서드를 적용합니다.

7. 데이터셋의 마지막 행들을 봅니다.

>>> stud_alcoh.tail() 

8. 원본 데이터프레임의 Mjob, Fjob 컬럼이 여전히 소문자인걸 알아차렸나요? 왜 그럴까요? 고쳐봅니다.

>>> stud_alcoh['Mjob'] = stud_alcoh['Mjob'].apply(capitalizer) # 첫글자를 대문자로 만든 후 그 값을 해당 컬럼에 재배치해야 합니다.
>>> stud_alcoh['Fjob'] = stud_alcoh['Fjob'].apply(capitalizer)
>>> stud_alcoh.tail()

9. legal_drinker라는 새로운 컬럼에 불린 값을 반환하는 majority라는 함수를 만듭니다.

(17세보다 많은 경우를 성년(majority)으로 본다는 것을 고려)

>>> def majority(x):
            if x > 17:
                    return True
            else:
                    return False
>>> stud_alcoh['legal_drinker'] = stud_alcoh['age'].apply(majority)
>>> stud_alcoh.head()

(Source : Pandas_exercises 깃헙)

반응형
반응형

1. pandas 라이브러리를 읽어들입니다.

>>> import pandas as pd

2. 아래 주소에서 데이터셋을 읽어들이고, drinks라는 변수에 할당합니다.

>>> drinks = pd.read_csv('https://raw.githubusercontent.com/justmarkham/DAT8/master/data/drinks.csv')
>>> drinks.head() # drinks의 데이터셋의 구조를 알기 위해 상위 열(5)을 조회합니다.

3. 어느 대륙에서 평균보다 맥주를 더 많이 마시는가?

>>> drinks.groupby('continent').beer_servings.mean() # groupby를 사용해서, 대륙별 맥주 소비량 평균을 계산합니다

4. 각 대륙별 와인 소비 현황을 파악하려면 어떻게 해야 하는가?

>>> drinks.groupby('continent').wine_servings.describe() # describe를 사용해서 대륙별 전체 데이터 개수, 평균값, 표준편차, 최소값, 4분위수, 최대값을 보여줍니다

5. 각 대륙별 평균 알코올 소비량은 어떻게 되는가?

>>> drinks.groupby('continent').mean() 

6. 각 대륙별 알코올 소비량 중앙값은 어떻게 되는가?

>>> drinks.groupby('continent').median()

7. 각 대륙별 와인 소비량의 평균값, 최소값, 최대값은 어떻게 되는가?

>>> drinks.groupby('continent').wine_servings.agg(['mean', 'min', 'max'])

(Source : Pandas exercises 깃헙)

반응형
반응형

1. pandas 라이브러리를 읽어들입니다.

>>> import pandas as pd

2. 아래 url 주소에서 데이터셋을 읽어들입니다.

>>> url = 'https://raw.githubusercontent.com/justmarkham/DAT8/master/data/chipotle.tsv'
>>> chipo = pd.read_csv(url, sep='\t') # 탭 구분자로 되어 있는 데이터셋을 읽어들임
>>> chipo.head() # chipo의 데이터 구조 파악을 위해 상위 5개 데이터셋을 조회

>>> chipo.dtypes # item_price 컬럼의 타입이 object인 것을 확인함(가격 계산을 위해 float으로 바꿀 것임) 

>>> prices = [float(value[1 : -1]) for value in chipo.item_price] # item_price컬럼 값을 for 반복문으로 읽고 맨 앞의 $를 제외한 후 float으로 변경하여 prices 변수에 저장함
>>> chipo.item_price = prices # float 타입의 가격을 데이터셋의 item_price에 재할달함
>>> chipo_filtered = chipo.drop_duplicates(['item_name', 'quantity']) # 아이템 이름과 수량이 중복되는 열들을 제외한 후 chipo_filtered 변수에 저장
>>> chipo_one_prod = chipo_filtered[chipo_filtered.quantity == 1] # 수량이 1인 제품들만 선택하여 chip_one_prod 변수에 저장
>>> chipo_one_prod[chipo_one_prod['item_price']>10.item_name.nunique() # 가격이 10보다 큰 아이템 이름들의 숫자를 알려줌(12개), item_name.unique()로 조회하면, 아래와 같이 배열로 보여줌

3. 각 아이템별 가격은 얼마인가?

>>> chipo[(chipo['item_name'] == 'Chicken Bowl') & (chipo['quantity'] == 1 # 아이템 중 'Chicken Bowl'을 선택하고 수량은 한 개인 경우라는 조건을 걸어 chipo 데이터셋에서 조회

4. 아이템 이름으로 정렬하기

>>> chipo.item_name.sort_values() # 또는
>>> chipo.sort_values(by = 'item_name') # 아이템 이름으로 chipo 데이터셋을 정렬

5. 주문한 아이템 중 아이템 가격이 가장 비싼 아이템의 수량은 얼마인가?

>>> chipo.sort_values(by = 'item_price', ascending = False).head(1) # 내림차순으로 아이템 가격을 정렬하기 위해 ascending = Fasle로 설정한 후, head(1)로 가장 상위의 열을 가져옴  

6. 주문한 채소 샐러드 접시는 몇 번이나 주문했는가?

>>> chipo_salad = chipo[chipo.item_name == 'Veggie Salad Bowl'] # chipo 데이터셋의 아이템 이름이 'Veggie Salad Bowl'인 데이터셋만 chipo_salad 변수에 저장함
>>> len(chipo_salad) # 18개가 결과로 나타남

7. 얼마나 많은 사람이 하나 이상의 캔 소다를 주문했는가?

>>> chipo_drink_steak_bowl = chipo[(chipo.item_name == 'Canned Soda') & (chipo.quantity > 1)] # 아이템 이름이 'Canned Soda'와 수량이 1개보다 큰 데이터셋을 chipo_drink_steak_bowl 변수에 저장함
>>> len(chipo_drink_steak_bowl) # 20개가 결과로 나타남

(Source : Pandas_exercises 깃헙)

반응형
반응형

파이썬의 pandas는 이제 필수적으로 알아야 하는 라이브러리가 되었다고 생각한다. 금융 쪽 뿐만 아니라 웹 스크래핑을 통해 데이터를 확보하고 그 자료를 딥러닝 등으로 분석하기 전 전처리에 유용하게 사용할 수 있는 도구로써도 유용하다고 본다.

우선적으로 Pandas DataFrame에서 사용할 수 있는 가장 기본적인 기능에 대해서 정리해 보고자 한다.

이번 글에서는 DataFrame에서 각 열과 컬럼(행)의 이름을 변경하는 것부터 해보자.

>>> import pandas as pd # pandas 라이브러리를 읽어들인다

>>> movies = pd.read_csv('movie.csv', index_col = 'movie_title') # csv파일을 읽어들이면서, 컬럼 중에서 인덱스로 만들 컬럼을 선택한다.

아래와 같이 딕셔너리로 된 대체 인덱스 및 컬럼으로 대입할 변수를 만듭니다.

>>> idx_rename = {'Avatar' : 'Ratava', 'Spectre' : 'Ertceps'}

>>> col_rename = {'director_name' : 'Director Name', 'num_critic_for_reviews' : 'Critical Reviews'}

rename 메서드를 사용해서, 인덱스와 컬럼에 딕셔너리를 전달합니다.

>>> movie_rename = movie.rename(index=idx_rename, columns=col_rename)

>>> movie_rename.head() # DataFrame 형태의 변수에 담긴 상위 열 데이터 일부(5개)를 조회합니다. 

(Source : Pandas Cookbook 깃헙)

앞으로도 짧게 파이썬 관련 유용한 정보를 정리해 보려고 합니다.

 

반응형
반응형
불확실성이 확대되고 미래가 어둡다고 생각되는 2019년이다. 

삶이 녹록치 않음을 느끼는 연령대가 40~50대가 아닐까? 
특히 IMF 전에 취직한 후 현재까지 회사라는 울타리에서 잘 지내다가 정년퇴직, 명퇴 등을 당한 40~50대는 무슨 일을 어떻게 해야할지 막막할 수 있을 것이다.
하지만, 변하는 세상만을 탓하고 있을 필요는 없다고 생각한다. 
이제 스스로 변해야 할 때가 되었다고 믿는다. 
그리고 변화된 나 자신을 만들어 내기 위한 첫걸음이 파이썬이 되길 바란다.   

난 40대 후반 인문학도로 세상의 빠른 흐름에 발 맞추기 위해 파이썬으로 데이터 분석에 도전하려고 하고 있다. 

그 이유는 무엇일까? 
  
디지털 시대로 전환하는 격변의 시대를 대비하기 위해서는 데이터 분석이 꼭 필요하게 되었기 때문이다. 늦은 나이란 없다고 생각한다. 그리고 파이썬은 친근하게 다가갈 수 있다. 그리고 바로 바로 답을 구할 수 있기 때문에, 날마다 꾸준히 도전한다면 본인의 역량을 일취월장시킬 수 있을 것이다.

젊은 친구들 뿐만 아니라 명예퇴직 대상이 된 40대 이상의 중장년층의 실직이 사회적 이슈가 되고 있다. 그만큼 사회 변화가 빠르게 이루어지고 있다고 본다. 
 
위기의 40대, 일자리 불안 커지고 소득은 급감, 막막한 50대, 졸라매도 ‘가난한 노후’ 속수무책이라는 인터넷 기사도 나온다. 
가장 큰 문제는 노후 대책이 전무한 경우가 50%에 육박한다는 것이다. 
40대 이상의 인문학 전공자들은 더욱 설자리가 없기에, 스스로 포기하는 경우도 생긴다.

자포자기하지 말자! 

파이썬과 함께 한다면 40~50대 인문학도도 데이터를 취득하고 분석할 수 있는 역량을 갖춰 사회에 유용한 정보를 제공할 수 있다는 것을 많은 사람들에게 보여주고 싶다.


반응형
반응형

index는 Series 또는 DataFrame에서 값을 찾기 위한 최적화된 도구라고 할 수 있다. 관계형 데이터베이스의 key와 많이 비슷하다고 이해하면 좋을 것 같다.

index 객체는 변경할 수 없다는 특징을 갖고 있다. 

또한, pandas에서 데이터 값들을 검색할 때는 index를 통해 검색하는 것이 컬럼을 가지고 검색하는 것보다 5배 정도 속도가 빠르다

* jupyter notebook에서 %timeit을 사용해 실행 속도를 시뮬레이션할 수 있음.


그렇기 때문에 pandas를 많이 사용하는 경우, index를 목적에 맞게 잘 생성하고 검색하는 데 이용할 수 있도록 할 필요가 있다.

그럼 먼저 pandas index 유형을 정리해 보도록 하자.

 

pandas index 유형

1. Int64Index 

정수 값을 위한 특정 Index로, 64비트 정수형의 불변하는 배열로 되어 있음. 

2. RangeIndex

Int64Index를 최적화한 Index로 최근에 추가됨. (start, stop, step) 특정 정수 값에서 시작하고 끝낼 수 있으며, 간격을 정할 수 있는 정수 기반 Index임. 

3. IntervalIndex

0.0~0.5와 같은 간격 인터벌을 Index로 사용할 수 있음.

4. DatetimeIndex 

나노초 타임스탬프를 저장함.
다음 code는 전체 5시간을 한시간 간격으로 된 index를 생성함.

4. PeriodIndex

년, 월, 날과 같은 기간 데이터를 위한 특정 Index임.

5. MultiIndex

단일 축에 여러 단계의 색인을 표현하는 계층적 Index 객체


반응형
반응형

Pandas에서 데이터 분석을 하기 위해 가장 많이 사용하는 것이 DataFrame일 것이다. 

Series를 확장한 것이 DataFrame이라고 이해하면 좀 더 쉽게 다가올 것이라 생각한다. 

기본 속성들을 정리해 보도록 하자.

>> import pandas as pd # pandas 라이브러리를 읽어들임

>> import numpy as np # numpy 라이브러리를 읽어들임


>> df = pd.DataFrame(np.arange(1, 6)) # numpy 배열(1에서 5까지)로부터 data frame을 생성함

>> df = pd.DataFrame(np.array([[70, 71], [90,91]]), columns=['Missoula', 'Philadelphia']) # columns 속성을 사용해 컬럼을 특정할 수 있음.

>> len(df) # 열이 얼마인지 확인하기 위해 len() 함수를 사용함.

>> df.shape # shape 속성으로 DataFrame의 치수(2,2)를 확인할 수 있음.


CSV 파일로부터 DataFrame 만들기

>> sp500 = pd.read_csv('data/sp500.csv', index_col = 'Symbol', usecols=[0,2,3,7]) # read_csv 함수로 이미 data폴더에 존재하는 sp500.csv 파일을 읽어들임. index의 컬럼명을 'Symbol'로 특정하고, 컬럼들 중에서 4개(0,2,3,7)의 특정 컬럼을 읽어들임.

>> sp500.head() # head()로 맨 앞 5개 열의 값들을 미리 볼 수 있음.

>> len(sp500) # 전체 열이 얼마인지 알 수 있음.

>> sp500.shape # sp500(DataFrame)의 치수를 확인할 수 있음.

>> sp500.size # size 속성으로 전체 데이터 크기를 알 수 있음(3컬럼* 전체 열의 수)

>> sp500.index # sp500의 index를 볼 수 있음

>> sp500.columns # sp500의 컬럼들의 이름을 확인해 볼 수 있음

* sp500.csv파일 다운로드


DataFrame 내에서 데이터에 접속하기

>> sp500['Sector'].head() # Sector 컬럼의 데이터들을 보여줌

>> type(sp500['Sector']) # type을 통해 각 컬럼의 구조를 알 수 있음(DataFrame의 단일 컬럼은 Series임)

>> sp500[['Price', 'Book Value']].head() # 2개 컬럼명을 통해 2개 컬럼의 앞 5개 열의 값들을 미리 볼 수 있음
>> sp500.Price # 컬럼명에 스페이스(빈칸)를 포함하고 있지 않다면, 콤마와 컬럼명으로 컬럼 데이터를 읽어들일 수 있음


DataFrame의 열 선택하기

>> sp500.loc['MMM'] # .loc[]를 사용해 index 이름으로 각 열을 읽어들일 수 있음
>> sp500.loc[['MMM', 'MSFT']] # 여러 열을 이름 리스트를 사용해 읽어들일 수도 있음
>> sp500.iloc[[0, 2]] # iloc[]를 사용해 위치에 맞는 각 열을 읽어들일 수 있음
 
>> i1 = sp500.index.get_loc('MMM') 
>> i2 = sp500.index.get_loc('A') # index 특정 이름의 위치를 index.get_loc()를 통해 파악한 후 그 값으로 각 열을 읽을 들일 수 있음
>> sp500.iloc[[i1, i2]]

at[]과 iat[]를 사용해 이름 또는 위치로 스칼라 찾기

>> sp500.at['MMM', 'Price'] # index와 컬럼 이름을 모두 사용해 값을 찾아냄 
>> sp500.iat[0, 1] # 열 0, 컬럼1이라는 위치를 사용해 값을 찾아냄

[] 연산자를 사용해 슬라이싱하기

>> sp500[:5] # 처음 5개 열(0~4)을 읽어들임
>> sp500['ABT' : 'ACN'] # ABT 이름부터 ACN 이름까지의 열들을 읽어들임

부울 선택을 사용해 열 선택하기

>> sp500[sp500.Price < 100] # sp500에서 Price 컬럼의 값이 100보다 작은 열들을 선택함

>> r = sp500[(sp500.Price < 10) & (sp500.Price > 6)]['Price'] # Price 컬럼의 값이 10보다 작고 6보다 큰 경우의 Price 컬럼 값들만 선택함

>> r = sp500[(sp500.Sector == 'Health Care') & (sp500.Price > 100.00)][['Price', 'Sector']] # Health Care 섹터에서 Price가 100보다 큰 Price와 Sector 컬럼 값들을 선택함


DataFrame 조작하기

컬럼명 바꾸기

>> newSP500 = sp500.rename(columns={'Book Value' : 'BookValue'}) # 공백이 있던 컬럼명을 rename() 메서드를 사용해 변경함. 단, 이 방법으로는 변경된 컬럼명을 가진 복사본을 돌려줌.

>> sp500.rename(columns = {'Book Value' : 'BookValue'}, inplace=True) # 복사본이 아닌 원본에서 컬럼명을 변경하려면 inplace=True 파라미터를 사용해야 함


[]와 .insert()로 새로운 컬럼 추가하기

>> sp500_copy = sp500.copy() # copy()로 복사본을 만들 수 있음
>> sp500_copy['RoundedPrice'] = sp500.Price.round() # Price 컬럼 값을 반올림한 신규 컬럼 RoundedPrice를 생성함
>> sp500_copy.insert(1, 'RoundedPrice', sp500.Price.round()) # .insert()를 사용해서 동일하게 신규 컬럼을 생성할 수 있음

연결(concatenation)을 사용해 컬럼 추가하기

>> rounded_price = pd.DataFrame({'RoundedPrice' : sp500.Price.round()}) # RoundedPrice 컬럼을 갖고 있는 DataFrame을 생성함
>> concatenated = pd.concat([sp500, rounded_price], axis=1) # y축(axis=1)을 기준으로 해서 두개의 DataFrame을 연결함. 

컬럼 지우기

del 키워드 또는 .pop() 또는 .drop()를 사용해 DataFrame으로부터 컬럼을 삭제할 수 있다. 

>> copy = sp500.copy()
>> del copy['BookValue']

>> copy = sp500.copy()
>> popped = copy.pop('Sector')

>> copy = sp500.copy()
>> afterdrop = copy.drop(['Sector'], axis = 1)



반응형

+ Recent posts