반응형

이번에는 pandas에서 데이터를 삭제하는 방법에 대해 알아보고자 합니다.

1. pandas, numpy 라이브러리를 불러들입니다.

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

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

>>> url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data'

3. 읽어들인 데이터셋을 wine 변수에 저장합니다.

>>> wine = pd.read_csv(url)
>>> wine.head()

4. 컬럼들 중에서 첫번째, 네번째, 일곱번째, 아홉번째, 열두번째, 열세번째, 열네번째 컬럼을 삭제합니다.

>>> wine = wine.drop(wine.columns[[0, 3, 6, 8, 11, 12, 13]], axis=1) # drop 메서드를 사용해서, 컬럼을 삭제합니다. axis=1 인수로 열을 삭제한다는 것을 명시합니다.
>>> wine.head()

5. 아래와 같이 열을 지정합니다. 

1) alcohol 2) malic_acid 3) alcalinity_of_ash 4) magnesium 5) flavanoids 6) proanthocyanins 7) hue

>>> wine.columns = ['alcohol', 'malic_acid', 'alcalinity_of_ash', 'magnesium', 'flavanoids', 'proanthocyanins', 'hue']
>>> wine.head()

6. alcohol 컬럼 첫 3행의 값을 NaN으로 설정합니다.

>>> wine.iloc[0:3, 0] = np.nan # iloc 메서드로 첫번째 열(0)부터 세번째 열(2)에, 첫번째 컬럼(0)에 적용합니다. 0부터 시작입니다.

>>> wine.head()

7. magnesium 컬럼의 3, 4행 값을 NaN으로 설정합니다.

>>> wine.iloc[2:4, 3] = np.nan # iloc 메서드로 세번째 열(2)부터 네번째 열(3)에, 세번째 컬럼(3)에 적용합니다. 0부터 시작입니다. 

>>> wine.head()

8. alcohol 컬럼의 NaN 값을 10으로 채우고, magnesium 컬럼의 NaN은 100으로 채웁니다.

>>> wine.alcohol.fillna(10, inplace = True) # fillna 메서드로 NaN 값을 10으로 바꿉니다. inplace=True로 다른 객체를 만드는 게 아니라 기존 객체를 바꿉니다.
>>> wine.magnesium.fillna(100, inplace = True) 
>>> wine.head()

9. 결측 값의 숫자를 합산합니다.

>>> wine.isnull().sum() # 결측 값을 가진 데이터가 없습니다.

10. 10까지의 범위에서 랜덤으로 숫자 배열을 생성합니다.

>>> random = np.random.randint(10, size = 10)
>>> random

11. 생성한 난수를 인덱스로 사용하고 각 셀에 NaN 값을 할당합니다.

>>> wine.alcohol[random] = np.nan
>>> wine.head(10)

12. 얼마나 많은 결측 값이 있는지 확인합니다.

>>> wine.isnull().sum()

13. 결측 값을 가진 행들을 삭제합니다.

>>> wine = wine.dropna(axis=0, how = 'any') # dropna 메서드로 결측값을 찾습니다. axis=0으로 행을 선택하고, how='any'로 하나라도 결측값이 있는 경우를 포함합니다.
>>> wine.head()

14. 인덱스를 재설정합니다. 

>>> wine = wine.reset_index(drop = True)
>>> wine.head()

 

(Source : Pandas exercises 깃헙)

반응형
반응형

1. pandas, numpy, matplotlib, seaborn 등 필요한 라이브러리를 읽어들입니다. 

>>> import pandas as pd
>>> import numpy as np
>>> import matplotlib.pyplot as plt # 파이썬에서 시각화를 처리하는데 필요한 대표적인 라이브러리로 생각하면 됩니다.
>>> import seaborn as sns # matplotlib를 바탕으로 해서 시각화를 더 멋지게 만들어줍니다.
% matplotlib inline # jupyter notebook(쥬피터 노트북) 내에서 그래프를 보여주도록 해줍니다.
sns.set(style='ticks') # 더 나은 스타일로 그래프를 보여주도록 seaborn을 설정합니다.

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

>>> path = 'https://raw.githubusercontent.com/guipsamora/pandas_exercises/master/07_Visualization/Online_Retail/Online_Retail.csv'

3. online_rt라는 변수에 데이터셋을 할당합니다.

>>> online_rt = pd.read_csv(path, encoding = 'latin1') # encoding 인수로 적합한 언어 인코딩을 적용합니다.
>>> online_rt.head()

4. 영국을 제외하고 수량(Quantity)이 가장 많은 10개 국가에 대한 히스토그램을 만듭니다.

>>> countries = online_rt.groupby('Country').sum() # groupby 메서드를 사용해 국가별 합계를 구하고 countries 변수에 저장합니다.
>>> countries = countries.sort_values(by = 'Quantity', ascending=False) # sort_values 메서드로 정렬합니다. 이때 정렬 기준은 by인수를 사용해 'Quantity'로 정하고, ascending=False를 사용해 내림차순으로 정리합니다.
>>> countries['Quantity'].plot(kind='bar') # 그래프를 만듭니다. 
>>> plt.xlabel('Countries') # x축 라벨을 정합니다.
>>> plt.ylabel('Quantity') # y축 라벨을 정합니다.
>>> plt.title('10 Countries with most orders') # 제목을 정합니다.
>>> plt.show() # 그래프를 보여줍니다.

5. 마이너스 수량은 제외하도록 처리합니다.

>>> online_rt = online_rt[online_rt.Quantity > 0] # 수량이 0보다 큰 경우에만 선택해서 online_rt 변수에 재배정합니다.
>>> online_rt.head()

6. 상위 3개 국가의 고객 ID별 단가별 수량을 사용하여 산점도를 만듭니다.

>>> customers = online_rt.groupby(['CustomerID', 'Country']).sum() # groupby 메서드를 사용해 CustomerID와 Country 컬럼에 대한 합계를 구해 customers 변수에 저장합니다.
>>> customers = customers[customers.UnitPrice > 0] # UnitPrice가 0보다 큰 데이타만 customers 변수에 재할당합니다.
>>> customers['Country'] = customers.index.get_level_values(1) # index.get_level_values() 메서드로 요청한 수준의 인덱스를 반환합니다. 레벨은 0부터 시작합니다.
>>> top_countries = ['Netherlands', 'EIRE', 'Germany']
>>> customers = customers[customers['Country'].isin(top_countries)] # top_countries에서 정한 국가들을 선택하기 위해 데이터 프레임을 필터링합니다.
>>> g = sns.FacetGrid(customers, col='Country') # FaceGrid를 만듭니다. FaceGrid가 만드는 플롯은 흔히 "격자", "격자"또는 "작은 다중 그래픽"이라고 불립니다.
>>> g.map(plt.scatter, 'Quantity', 'UnitPrice', alpha=1) # map 메서드로 각 Facet의 데이터 하위 집합에 플로팅 기능을 적용합니다.
>>> g.add_legend() # 범례를 추가합니다.

7. 앞의 결과가 왜 이렇게 보잘 것 없는지를 조사합니다.

>>> customers = online_rt.groupby(['CustomerID', 'Country']).sum()
>>> customers

7-1. 수량(Quantity)과 단가(UnitPrice)를 별도로 보는 게 의미가 있을까?

>>> display(online_rt[online_rt.CustomerID == 12347.0].sort_values(by='UnitPrice', ascending=False).head())
>>> display(online_rt[online_rt.CustomerID == 12346.0].sort_values(by='UnitPrice', ascending=False).head()) # 고객ID 12346.0번은 다른 나라와 다르게 수량이 매우 많고, 단가는 매우 낮게 나옵니다. 그 이유를 알아볼 필요가 있어서 살펴보고자 합니다. 아래 데이터에서 보듯이 고객 ID 12346.0은 단 한건의 주문으로 대량 주문한 경우가 되겠습니다. 

7-2. 6번 최초의 질문으로 돌아가 보면, '상위 3개 국가의 고객 ID별 단가별 수량을 사용하여 산점도를 만듭니다'에 대해 구체화해서 생각해 봐야 합니다. 총 판매량이냐? 아니면 총 수익으로 계산해야 할 것인가? 먼저 판매량에 따라 분석해 보도록 하겠습니다.

>>> sales_volume = online_rt.groupby('Country').Quantity.sum().sort_values(ascending=False)
>>> top3 = sales_volume.index[1:4] # 영국을 제외합니다.
>>> top3

7-3. 이제 상위 3개국을 알게 되었습니다. 이제 나머지 문제에 집중합니다. 국가 ID는 쉽습니다. groupby 메서드로 'CustomerID'컬럼을 그룹핑하면 됩니다. 'Quantity per UnitPrice'부분이 까다롭습니다. 단순히 Quantity 또는 UnitPrice로 계산하는 것은 원하는 단가별 수량을 얻기 어렵습니다. 따라서, 두개 컬럼을 곱해 수익 'Revenue'라는 컬럼을 만듭니다.

>>> online_rt['Revenue'] = online_rt.Quantity * online_rt.UnitPrice
>>> online_rt.head()

7-4. 각 국가 주문별로 평균 가격(수익/수량)을 구합니다. 

>>> grouped = online_rt[online_rt.Country.isin(top3)].groupby(['CustomerID', 'Country])
>>> plottable = grouped['Quantity', 'Revenue'].agg('sum')
>>> plottable['Country'] = plottable.index.get_level_values(1)
>>> plottable.head()

7-5. 그래프 그리기.

>>> g = sns.FacetGrid(plottable, col='Country') # FaceGrid를 만듭니다. FaceGrid가 만드는 플롯은 흔히 "격자", "격자"또는 "작은 다중 그래픽"이라고 불립니다.
>>> g.map(plt.scatter, 'Quantity', 'AvgPrice', alpha=1) # map 메서드로 각 Facet의 데이터 하위 집합에 플로팅 기능을 적용합니다.
>>> g.add_legend() # 범례를 추가합니다.

7-6. 아직 그래프의 정보가 만족스럽지 못합니다. 많은 데이타가 수량은 50000 미만, 평균 가격은 5 이하인 경우라는 것을 확인할 수 있습니다. 트렌드를 볼 수 있을 것 같은데, 이 3개국 만으로는 부족합니다.

>>> grouped = online_rt.groupby(['CustomerID'])
>>> plottable = grouped['Quantity', 'Revenue'].agg('sum')
>>> plottable['AvgPrice'] = plottable.Revenue / plottable.Quantity
>>> plt.scatter(plottable.Quantity, plottable.AvgPrice)
>>> plt.plot()

7-7. 커브를 명확하게 보기 위해 확대해 봅니다.

>>> grouped = online_rt.groupby(['CustomerID', 'Country'])
>>> plottable = grouped.agg({'Quantity' : 'sum', 'Revenue' : 'sum'})
>>> plottable['AvgPrice'] = plottable.Revenue / plottable.Quantity
>>> plt.scatter(plottable.Quantity, plottable.AvgPrice)
>>> plt.xlim(-40, 2000) # 확대하기 위해 x축을 2000까지만 표시합니다.
>>> plt.ylim(-1, 80) # y축은 80까지만 표시합니다.
>>> plt.plot() # 아래 그래프에서 우리는 인사이트를 볼 수 있습니다. 평균 가격이 높아질수록, 주문 수량은 줄어든다는 것입니다. 

8. 단가 (x) 당 수익 (y)을 보여주는 선형 차트를 그립니다.

8-1. 가격 [0~50]을 간격 1로하여 단가를 그룹화하고 수량과 수익을 그룹핑니다.

>>> price_start = 0
>>> price_end = 50
>>> price_interval = 1
>>> buckets = np.arange(price_start, price_end, price_interval)
>>> revenue_per_price = online_rt.groupby(pd.cut(online_rt.UnitPrice, buckets)).Revenue.sum()
>>> revenue_per_price.head()

8-2. 그래프를 그려봅니다.

>>> revenue_per_price.plot()
>>> plt.xlabel('Unit Price (in intervals of ' +str(price_interval_+')')
>>> plt.ylabel('Revenue')
>>> plt.show()

8-3. 좀 더 멋지게 그려보도록 합니다.

>>> revenue_per_price.plot()
>>> plt.xlabel('Unit Price (in buckets of '+str(price_interval)+')')
>>> plt.ylabel('Revenue')
>>> plt.xticks(np.arange(price_start, price_end, 3), np.arange(price_start, price_end, 3))
>>> plt.yticks(0, 500000, 1000000, 1500000, 2000000, 2500000], ['0', '$0.5M', '$1M', '$1.5M', '$2M', '$2.5M'])
>>> plt.show()

(Source : Pandas exercises 깃헙)

반응형
반응형

판다스(Pandas)의 기능 중 데이터셋으로 기본적인 통계작업을 하는 명령어들을 알아보도록 합니다.

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

>>> import pandas as pd
>>> import datetime

2. data_url 변수에 다음 주소를 저장합니다.

>>> data_url = 'https://raw.githubusercontent.com/guipsamora/pandas_exercises/master/06_Stats/Wind_Stats/wind.data'

3. pandas로 위 주소를 data 변수로 읽어들이되, 처음 3개 컬럼을 datetime 인덱스로 대체합니다.

>>> data = pd.read_table(data_url, sep = '\s+', parse_dates = [[0, 1, 2]]) # parse_dates 인수는 불린값 또는 숫자 리스트 또는 여러 컬럼들 값을 읽어들여서 날짜로 처리할 수 있습니다. 여기서는 맨 앞에 3개의 컬럼 값으로 날짜를 인식하도록 합니다.
>>> data.head() # 데이터셋의 구조를 알아보기 위해 상위 열 5개를 조회합니다.

4. 년도가 2061? 이 년도의 데이터가 실제로 있을까요? 이것을 수정해서 적용할 수 있는 함수를 만들어 봅시다.

>>> def fix_century(x):
               year = x.year - 100 if x.year > 1989 else x.year
               return datetime.date(year, x.month, x.day)      # 년도 데이터를 1900년대와 2000년대 구분을 위해 1989보다 많은 경우에는 1900년대으로 변경하도록 if문으로 간단한 함수를 만듭니다.
>>> data['Yr_Mo_Dy'] = data['Yr_Mo_Dy'].apply(fix_century) # apply 메서드를 사용해 'Yr_Mo_Dy'] 컬럼 전체에 함수를 적용합니다. 
>>> data.head() # 다시 데이터셋의 구조를 알아보기 위해 상위 열 5개를 조회합니다.

5. 날짜를 인덱스로 설정합니다. 이때 데이터 타입을 변경해서 적용해야 합니다. 데이터 타입은 datetime64[ns]여야 합니다.

>>> data['Yr_Mo_Dr'] = pd.to_datetime(data['Yr_Mo_Dy']) # 'Yr_Mo_Dy' 컬럼의 데이터 타입을 datetime64[ns]로 변경합니다.
>>> data = data.set_index('Yr_Mo_Dy') # set_index 메서드를 사용해 'Yr_Mo_Dy' 컬럼을 인덱스로 설정합니다.
>>> data.head()

6. 전체 데이터 값의 각 컬럼별 누락된 값을 알아봅니다. 

>>> data.isnull().sum() # 각 컬럼 값들 중에서 결측 값(Null)이 있는 곳의 갯수를 확인합니다.

7. 결측 값을 가진 데이터를 제외한 전체 데이터를 계산해 봅니다.

>>> data.shape[0] - data.isnull().sum()

또는

>>> data.notnull().sum()

8. 모든 위치와 전체 시간의 풍속에 대한 평균 값을 계산합니다.

>>> data.fillna(0).values.flatten().mean() # 결측값을 fillna(0)를 사용해 0으로 대체합니다. 그 후 dataframe을 list로 변경하는 flatten() 메서드를 사용한 후, 평균 값을 계산합니다.
>>> 10.223864592840483

9.  data의 각종 통계 수치를 한눈에 볼 수 있도록 표시해 봅니다.

>>> data.describe(percentiles=[])

10. day_stats라는 데이터 프레임을 만들고 모든 위치 및 전체 시간에 대한 풍속의 최소, 최대 및 평균 풍속 및 표준편차를 계산합니다.

>>> day_stats = pd.DataFrame()
>>> day_stats['min'] = data.min(axis = 1) # 최소값
>>> day_stats['max'] = data.max(axis = 1) # 최대값
>>> day_stats['mean'] = data.mean(axis = 1) # 평균
>>> day_stats['std'] = data.std(axis = 1) # 표준편차

11. 각 위치에 대한 1월의 평균 풍속을 찾아 봅니다.

>>> data.loc[data.index.month == 1].mean()

12. 연간 빈도로 각 위치별로 레코드를 다운 샘플링합니다.

>>> data.groupby(data.index.to_period('A')).mean()

13. 월간 빈도로 각 위치별로 레코드를 다운 샘플링합니다.

>>> data.groupby(data.index.to_period('M')).mean()

14. 주간 빈도로 각 위치별로 레코드를 다운 샘플링합니다.

>>> data.groupby(data.index.to_period('W')).mean()

15. 처음 52주 동안, 매주 모든 지역 풍속의 최소, 최대 및 평균 풍속 및 표준 편차를 계산합니다.

>>> weekly = data.resample('W').agg(['min', 'max', 'mean', 'std']) # 데이터를 'W(주)'에 재샘플링하고 agg 메서드를 사용해 최소, 최대, 평균, 표준편차 함수를 적용합니다.
>>> weekly.loc[weekly.index[1:53], 'RPT':'MAL'].head(10) # 처음 52주 동안의 값들 중 상위 10개 데이터 열을 보여줍니다.

(Source : Pandas exercises 깃헙)

반응형
반응형

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 깃헙)

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

 

반응형

+ Recent posts