판다스 연습 튜토리얼#
9회 빅분기 실기 대비 강의, 블로그만으로는 도저히 안되겠다ㅠ 하시는분들에게 추천합니다.
아 제발 광고 한번씩만 눌러주세요 ㅠㅠ 두번은 더 좋구요
빅분기, adp 정보공유 오픈카톡방1
@@@참여 링크@@@
참여 코드 : dbscan (수시 업데이트, 카톡 화면 하단에 문제 확인 해주세요)빅분기, adp 정보공유 오픈카톡방2
@@@참여 링크@@@
Attention
목차 및 구성 출처 : 원본 깃헙주소
데이터 일부 수정 후 작업 진행했습니다.
주피터 노트북 단축키 참고영상
01 Getting & Knowing Data#
import pandas as pd
Attention
롤 랭킹 데이터 : https://www.kaggle.com/datasnaek/league-of-legends
DataUrl = ‘https://raw.githubusercontent.com/Datamanim/pandas/main/lol.csv’
Question 1
데이터를 로드하라. 데이터는 \t을 기준으로 구분되어있다.
1번 , 주피터 노트북에서 메소드 사용법 유튜브 풀이
type(df)
pandas.core.frame.DataFrame
Question 2
데이터의 상위 5개 행을 출력하라
2번 유튜브 풀이
Show code cell source
Ans = df.head(5)
Ans
gameId | creationTime | gameDuration | seasonId | winner | firstBlood | firstTower | firstInhibitor | firstBaron | firstDragon | ... | t2_towerKills | t2_inhibitorKills | t2_baronKills | t2_dragonKills | t2_riftHeraldKills | t2_ban1 | t2_ban2 | t2_ban3 | t2_ban4 | t2_ban5 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 3326086514 | 1504279457970 | 1949 | 9 | 1 | 2 | 1 | 1 | 1 | 1 | ... | 5 | 0 | 0 | 1 | 1 | 114 | 67 | 43 | 16 | 51 |
1 | 3229566029 | 1497848803862 | 1851 | 9 | 1 | 1 | 1 | 1 | 0 | 1 | ... | 2 | 0 | 0 | 0 | 0 | 11 | 67 | 238 | 51 | 420 |
2 | 3327363504 | 1504360103310 | 1493 | 9 | 1 | 2 | 1 | 1 | 1 | 2 | ... | 2 | 0 | 0 | 1 | 0 | 157 | 238 | 121 | 57 | 28 |
3 | 3326856598 | 1504348503996 | 1758 | 9 | 1 | 1 | 1 | 1 | 1 | 1 | ... | 0 | 0 | 0 | 0 | 0 | 164 | 18 | 141 | 40 | 51 |
4 | 3330080762 | 1504554410899 | 2094 | 9 | 1 | 2 | 1 | 1 | 1 | 1 | ... | 3 | 0 | 0 | 1 | 0 | 86 | 11 | 201 | 122 | 18 |
5 rows × 61 columns
Question 3
데이터의 행과 열의 갯수를 파악하라
3번 유튜브 풀이
Show code cell source
print(df.shape)
print('행:',df.shape[0])
print('열:',df.shape[1])
(51490, 61)
행: 51490
열: 61
Question 4
전체 컬럼을 출력하라
4번 유튜브 풀이
Show code cell source
Ans = df.columns
Ans
Index(['gameId', 'creationTime', 'gameDuration', 'seasonId', 'winner',
'firstBlood', 'firstTower', 'firstInhibitor', 'firstBaron',
'firstDragon', 'firstRiftHerald', 't1_champ1id', 't1_champ1_sum1',
't1_champ1_sum2', 't1_champ2id', 't1_champ2_sum1', 't1_champ2_sum2',
't1_champ3id', 't1_champ3_sum1', 't1_champ3_sum2', 't1_champ4id',
't1_champ4_sum1', 't1_champ4_sum2', 't1_champ5id', 't1_champ5_sum1',
't1_champ5_sum2', 't1_towerKills', 't1_inhibitorKills', 't1_baronKills',
't1_dragonKills', 't1_riftHeraldKills', 't1_ban1', 't1_ban2', 't1_ban3',
't1_ban4', 't1_ban5', 't2_champ1id', 't2_champ1_sum1', 't2_champ1_sum2',
't2_champ2id', 't2_champ2_sum1', 't2_champ2_sum2', 't2_champ3id',
't2_champ3_sum1', 't2_champ3_sum2', 't2_champ4id', 't2_champ4_sum1',
't2_champ4_sum2', 't2_champ5id', 't2_champ5_sum1', 't2_champ5_sum2',
't2_towerKills', 't2_inhibitorKills', 't2_baronKills', 't2_dragonKills',
't2_riftHeraldKills', 't2_ban1', 't2_ban2', 't2_ban3', 't2_ban4',
't2_ban5'],
dtype='object')
Question 5
6번째 컬럼명을 출력하라
5번 유튜브 풀이
Show code cell source
Ans = df.columns[5]
Ans
'firstBlood'
Question 6
6번째 컬럼의 데이터 타입을 확인하라
6번 유튜브 풀이
Show code cell source
Ans = df.iloc[:,5].dtype
Ans
dtype('int64')
Question 7
데이터셋의 인덱스 구성은 어떤가
7번 유튜브 풀이
Show code cell source
Ans = df.index
Ans
RangeIndex(start=0, stop=51490, step=1)
Question 8
6번째 컬럼의 3번째 값은 무엇인가?
8번 유튜브 풀이
Show code cell source
Ans = df.iloc[2,5]
Ans
2
Attention
제주 날씨,인구에 따른 교통량데이터 : 출처 제주 데이터 허브 DataUrl = ‘https://raw.githubusercontent.com/Datamanim/pandas/main/Jeju.csv’
Question 9
데이터를 로드하라. 컬럼이 한글이기에 적절한 처리해줘야함
9번 유튜브 풀이
DataUrl = 'https://raw.githubusercontent.com/Datamanim/pandas/main/Jeju.csv'
df = pd.read_csv(DataUrl,encoding='euc-kr')
type(df)
pandas.core.frame.DataFrame
Question 10
데이터 마지막 3개행을 출력하라
10번 유튜브 풀이
Show code cell source
Ans = df.tail(3)
Ans
id | 일자 | 시도명 | 읍면동명 | 거주인구 | 근무인구 | 방문인구 | 총 유동인구 | 평균 속도 | 평균 소요 시간 | 평균 기온 | 일강수량 | 평균 풍속 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
9618 | 32066 | 2020-04-30 | 제주시 | 도두동 | 28397.481 | 3144.895 | 84052.697 | 115595.073 | 41.053 | 29.421 | 20.3 | 0.0 | 3.0 |
9619 | 32067 | 2020-04-30 | 서귀포시 | 안덕면 | 348037.846 | 29106.286 | 251129.660 | 628273.792 | 46.595 | 49.189 | 17.6 | 0.0 | 3.5 |
9620 | 32068 | 2020-04-30 | 제주시 | 연동 | 1010643.372 | 65673.477 | 447622.068 | 1523938.917 | 40.863 | 27.765 | 14.1 | 0.0 | 4.8 |
Question 11
수치형 변수를 가진 컬럼을 출력하라
11번 유튜브 풀이
Show code cell source
Ans = df.select_dtypes(exclude=object).columns
Ans
Index(['id', '거주인구', '근무인구', '방문인구', '총 유동인구', '평균 속도', '평균 소요 시간', '평균 기온',
'일강수량', '평균 풍속'],
dtype='object')
Question 12
범주형 변수를 가진 컬럼을 출력하라
12번 유튜브 풀이
Show code cell source
Ans = df.select_dtypes(include=object).columns
Ans
Index(['일자', '시도명', '읍면동명'], dtype='object')
Question 13
각 컬럼의 결측치 숫자를 파악하라
13번 유튜브 풀이
Show code cell source
Ans = df.isnull().sum()
Ans
id 0
일자 0
시도명 0
읍면동명 0
거주인구 0
근무인구 0
방문인구 0
총 유동인구 0
평균 속도 0
평균 소요 시간 0
평균 기온 0
일강수량 0
평균 풍속 0
dtype: int64
Question 14
각 컬럼의 데이터수, 데이터타입을 한번에 확인하라
14번 유튜브 풀이
Show code cell source
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 9621 entries, 0 to 9620
Data columns (total 13 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 id 9621 non-null int64
1 일자 9621 non-null object
2 시도명 9621 non-null object
3 읍면동명 9621 non-null object
4 거주인구 9621 non-null float64
5 근무인구 9621 non-null float64
6 방문인구 9621 non-null float64
7 총 유동인구 9621 non-null float64
8 평균 속도 9621 non-null float64
9 평균 소요 시간 9621 non-null float64
10 평균 기온 9621 non-null float64
11 일강수량 9621 non-null float64
12 평균 풍속 9621 non-null float64
dtypes: float64(9), int64(1), object(3)
memory usage: 977.3+ KB
Question 15
각 수치형 변수의 분포(사분위, 평균, 표준편차, 최대 , 최소)를 확인하라
15번 유튜브 풀이
Show code cell source
Ans = df.describe()
Ans
id | 거주인구 | 근무인구 | 방문인구 | 총 유동인구 | 평균 속도 | 평균 소요 시간 | 평균 기온 | 일강수량 | 평균 풍속 | |
---|---|---|---|---|---|---|---|---|---|---|
count | 9621.000000 | 9.621000e+03 | 9621.000000 | 9621.000000 | 9.621000e+03 | 9621.000000 | 9621.000000 | 9621.000000 | 9621.000000 | 9621.000000 |
mean | 27258.000000 | 3.174315e+05 | 35471.201510 | 195889.561802 | 5.487922e+05 | 41.109084 | 37.215873 | 13.550828 | 6.972426 | 2.753171 |
std | 2777.487804 | 2.982079e+05 | 40381.214775 | 140706.090325 | 4.608802e+05 | 8.758631 | 12.993786 | 7.745515 | 27.617260 | 1.498538 |
min | 22448.000000 | 9.305552e+03 | 1407.936000 | 11538.322000 | 2.225181e+04 | 24.333000 | 12.667000 | -9.600000 | 0.000000 | 0.000000 |
25% | 24853.000000 | 9.539939e+04 | 12074.498000 | 99632.153000 | 2.216910e+05 | 34.250000 | 27.889000 | 7.600000 | 0.000000 | 1.700000 |
50% | 27258.000000 | 2.221105e+05 | 21960.928000 | 152805.335000 | 3.866935e+05 | 39.640000 | 34.500000 | 13.400000 | 0.000000 | 2.400000 |
75% | 29663.000000 | 4.106671e+05 | 40192.032000 | 236325.109000 | 6.406918e+05 | 49.105000 | 46.176000 | 19.700000 | 1.500000 | 3.400000 |
max | 32068.000000 | 1.364504e+06 | 263476.965000 | 723459.209000 | 2.066484e+06 | 103.000000 | 172.200000 | 30.400000 | 587.500000 | 13.333000 |
Question 16
거주인구 컬럼의 값들을 출력하라
16번 유튜브 풀이
Show code cell source
Ans = df['거주인구']
Ans
0 32249.987
1 213500.997
2 1212382.218
3 33991.653
4 155036.925
...
9616 228260.005
9617 459959.064
9618 28397.481
9619 348037.846
9620 1010643.372
Name: 거주인구, Length: 9621, dtype: float64
Question 17
평균 속도 컬럼의 4분위 범위(IQR) 값을 구하여라
17번 유튜브 풀이
Show code cell source
Ans = df['평균 속도'].quantile(0.75) -df['평균 속도'].quantile(0.25)
Ans
14.854999999999997
Question 18
읍면동명 컬럼의 유일값 갯수를 출력하라
18번 유튜브 풀이
Show code cell source
Ans = df.읍면동명.nunique()
Ans
41
Question 19
읍면동명 컬럼의 유일값을 모두 출력하라
19번 유튜브 풀이
Show code cell source
Ans = df.읍면동명.unique()
Ans
array(['도두동', '외도동', '이도2동', '일도1동', '대천동', '서홍동', '한경면', '송산동', '조천읍',
'일도2동', '영천동', '예래동', '대륜동', '삼도1동', '이호동', '건입동', '중앙동', '삼양동',
'삼도2동', '이도1동', '남원읍', '대정읍', '정방동', '효돈동', '아라동', '한림읍', '구좌읍',
'용담1동', '오라동', '화북동', '연동', '표선면', '중문동', '성산읍', '안덕면', '천지동',
'노형동', '동홍동', '용담2동', '봉개동', '애월읍'], dtype=object)
02 Filtering & Sorting#
Attention
식당데이터 : justmarkham/DAT8
DataUrl = ‘https://raw.githubusercontent.com/Datamanim/pandas/main/chipo.csv’
Question 20
데이터를 로드하라.
20번 유튜브 풀이
DataUrl = 'https://raw.githubusercontent.com/Datamanim/pandas/main/chipo.csv'
df = pd.read_csv(DataUrl)
Ans = type(df)
Ans
pandas.core.frame.DataFrame
Question 21
quantity컬럼 값이 3인 데이터를 추출하여 첫 5행을 출력하라
21번 유튜브 풀이
Show code cell source
Ans = df.loc[df['quantity']==3].head()
Ans
order_id | quantity | item_name | choice_description | item_price | |
---|---|---|---|---|---|
409 | 178 | 3 | Chicken Bowl | [[Fresh Tomato Salsa (Mild), Tomatillo-Green C... | $32.94 |
445 | 193 | 3 | Bowl | [Braised Carnitas, Pinto Beans, [Sour Cream, C... | $22.20 |
689 | 284 | 3 | Canned Soft Drink | [Diet Coke] | $3.75 |
818 | 338 | 3 | Bottled Water | NaN | $3.27 |
850 | 350 | 3 | Canned Soft Drink | [Sprite] | $3.75 |
Question 22
quantity컬럼 값이 3인 데이터를 추출하여 index를 0부터 정렬하고 첫 5행을 출력하라
22번 유튜브 풀이
Show code cell source
Ans = df.loc[df['quantity']==3].head().reset_index(drop=True)
Ans
order_id | quantity | item_name | choice_description | item_price | |
---|---|---|---|---|---|
0 | 178 | 3 | Chicken Bowl | [[Fresh Tomato Salsa (Mild), Tomatillo-Green C... | $32.94 |
1 | 193 | 3 | Bowl | [Braised Carnitas, Pinto Beans, [Sour Cream, C... | $22.20 |
2 | 284 | 3 | Canned Soft Drink | [Diet Coke] | $3.75 |
3 | 338 | 3 | Bottled Water | NaN | $3.27 |
4 | 350 | 3 | Canned Soft Drink | [Sprite] | $3.75 |
Question 23
quantity , item_price 두개의 컬럼으로 구성된 새로운 데이터 프레임을 정의하라
23번 유튜브 풀이
Show code cell source
Ans =df[['quantity','item_price']]
Ans
quantity | item_price | |
---|---|---|
0 | 1 | $2.39 |
1 | 1 | $3.39 |
2 | 1 | $3.39 |
3 | 1 | $2.39 |
4 | 2 | $16.98 |
... | ... | ... |
4617 | 1 | $11.75 |
4618 | 1 | $11.75 |
4619 | 1 | $11.25 |
4620 | 1 | $8.75 |
4621 | 1 | $8.75 |
4622 rows × 2 columns
Question 24
item_price 컬럼의 달러표시 문자를 제거하고 float 타입으로 저장하여 new_price 컬럼에 저장하라
24번 유튜브 풀이
Show code cell source
df['new_price'] = df['item_price'].str[1:].astype('float')
Ans = df['new_price'].head()
Ans
0 2.39
1 3.39
2 3.39
3 2.39
4 16.98
Name: new_price, dtype: float64
Question 25
new_price 컬럼이 5이하의 값을 가지는 데이터프레임을 추출하고, 전체 갯수를 구하여라
25번 유튜브 풀이
Show code cell source
Ans = len(df.loc[df.new_price <=5])
Ans
1652
Question 26
item_name명이 Chicken Salad Bowl 인 데이터 프레임을 추출하라고 index 값을 초기화 하여라
26번 유튜브 풀이
Show code cell source
Ans = df.loc[df.item_name =='Chicken Salad Bowl'].reset_index(drop=True)
Ans.head(3)
order_id | quantity | item_name | choice_description | item_price | new_price | |
---|---|---|---|---|---|---|
0 | 20 | 1 | Chicken Salad Bowl | [Fresh Tomato Salsa, [Fajita Vegetables, Pinto... | $8.75 | 8.75 |
1 | 60 | 2 | Chicken Salad Bowl | [Tomatillo Green Chili Salsa, [Sour Cream, Che... | $22.50 | 22.50 |
2 | 94 | 2 | Chicken Salad Bowl | [Fresh Tomato Salsa, [Fajita Vegetables, Pinto... | $22.50 | 22.50 |
Question 27
new_price값이 9 이하이고 item_name 값이 Chicken Salad Bowl 인 데이터 프레임을 추출하라
27번 유튜브 풀이
Show code cell source
Ans = df.loc[(df.item_name =='Chicken Salad Bowl') & (df.new_price <= 9)]
Ans.head(5)
order_id | quantity | item_name | choice_description | item_price | new_price | |
---|---|---|---|---|---|---|
44 | 20 | 1 | Chicken Salad Bowl | [Fresh Tomato Salsa, [Fajita Vegetables, Pinto... | $8.75 | 8.75 |
256 | 111 | 1 | Chicken Salad Bowl | [Fresh Tomato Salsa, [Fajita Vegetables, Rice,... | $8.75 | 8.75 |
526 | 220 | 1 | Chicken Salad Bowl | [Roasted Chili Corn Salsa, [Black Beans, Sour ... | $8.75 | 8.75 |
528 | 221 | 1 | Chicken Salad Bowl | [Tomatillo Green Chili Salsa, [Fajita Vegetabl... | $8.75 | 8.75 |
529 | 221 | 1 | Chicken Salad Bowl | [Tomatillo Green Chili Salsa, [Fajita Vegetabl... | $8.75 | 8.75 |
Question 28
df의 new_price 컬럼 값에 따라 오름차순으로 정리하고 index를 초기화 하여라
28번 유튜브 풀이
Show code cell source
Ans = df.sort_values('new_price').reset_index(drop=True)
Ans.head(4)
order_id | quantity | item_name | choice_description | item_price | new_price | |
---|---|---|---|---|---|---|
0 | 471 | 1 | Bottled Water | NaN | $1.09 | 1.09 |
1 | 338 | 1 | Canned Soda | [Coca Cola] | $1.09 | 1.09 |
2 | 1575 | 1 | Canned Soda | [Dr. Pepper] | $1.09 | 1.09 |
3 | 47 | 1 | Canned Soda | [Dr. Pepper] | $1.09 | 1.09 |
Question 29
df의 item_name 컬럼 값중 Chips 포함하는 경우의 데이터를 출력하라
29번 유튜브 풀이
Show code cell source
Ans = df.loc[df.item_name.str.contains('Chips')]
Ans.head(5)
order_id | quantity | item_name | choice_description | item_price | new_price | |
---|---|---|---|---|---|---|
0 | 1 | 1 | Chips and Fresh Tomato Salsa | NaN | $2.39 | 2.39 |
3 | 1 | 1 | Chips and Tomatillo-Green Chili Salsa | NaN | $2.39 | 2.39 |
6 | 3 | 1 | Side of Chips | NaN | $1.69 | 1.69 |
10 | 5 | 1 | Chips and Guacamole | NaN | $4.45 | 4.45 |
14 | 7 | 1 | Chips and Guacamole | NaN | $4.45 | 4.45 |
Question 30
df의 짝수번째 컬럼만을 포함하는 데이터프레임을 출력하라
30번 유튜브 풀이
Show code cell source
Ans = df.iloc[:,::2]
Ans.head(5)
order_id | item_name | item_price | |
---|---|---|---|
0 | 1 | Chips and Fresh Tomato Salsa | $2.39 |
1 | 1 | Izze | $3.39 |
2 | 1 | Nantucket Nectar | $3.39 |
3 | 1 | Chips and Tomatillo-Green Chili Salsa | $2.39 |
4 | 2 | Chicken Bowl | $16.98 |
Question 31
df의 new_price 컬럼 값에 따라 내림차순으로 정리하고 index를 초기화 하여라
31번 유튜브 풀이
Show code cell source
Ans = df.sort_values('new_price',ascending=False).reset_index(drop=True)
Ans.head(4)
order_id | quantity | item_name | choice_description | item_price | new_price | |
---|---|---|---|---|---|---|
0 | 1443 | 15 | Chips and Fresh Tomato Salsa | NaN | $44.25 | 44.25 |
1 | 1398 | 3 | Carnitas Bowl | [Roasted Chili Corn Salsa, [Fajita Vegetables,... | $35.25 | 35.25 |
2 | 511 | 4 | Chicken Burrito | [Fresh Tomato Salsa, [Fajita Vegetables, Rice,... | $35.00 | 35.00 |
3 | 1443 | 4 | Chicken Burrito | [Fresh Tomato Salsa, [Rice, Black Beans, Chees... | $35.00 | 35.00 |
Question 32
df의 item_name 컬럼 값이 Steak Salad 또는 Bowl 인 데이터를 인덱싱하라
32번 유튜브 풀이
Show code cell source
Ans = df.loc[(df.item_name =='Steak Salad') | (df.item_name =='Bowl')]
Ans
order_id | quantity | item_name | choice_description | item_price | new_price | |
---|---|---|---|---|---|---|
445 | 193 | 3 | Bowl | [Braised Carnitas, Pinto Beans, [Sour Cream, C... | $22.20 | 22.20 |
664 | 276 | 1 | Steak Salad | [Tomatillo-Red Chili Salsa (Hot), [Black Beans... | $8.99 | 8.99 |
673 | 279 | 1 | Bowl | [Adobo-Marinated and Grilled Steak, [Sour Crea... | $7.40 | 7.40 |
752 | 311 | 1 | Steak Salad | [Tomatillo-Red Chili Salsa (Hot), [Black Beans... | $8.99 | 8.99 |
893 | 369 | 1 | Steak Salad | [Fresh Tomato Salsa (Mild), [Rice, Cheese, Sou... | $8.99 | 8.99 |
3502 | 1406 | 1 | Steak Salad | [[Lettuce, Fajita Veggies]] | $8.69 | 8.69 |
Question 33
df의 item_name 컬럼 값이 Steak Salad 또는 Bowl 인 데이터를 데이터 프레임화 한 후, item_name를 기준으로 중복행이 있으면 제거하되 첫번째 케이스만 남겨라
33번 유튜브 풀이
Show code cell source
Ans = df.loc[(df.item_name =='Steak Salad') | (df.item_name =='Bowl')]
Ans = Ans.drop_duplicates('item_name')
Ans
order_id | quantity | item_name | choice_description | item_price | new_price | |
---|---|---|---|---|---|---|
445 | 193 | 3 | Bowl | [Braised Carnitas, Pinto Beans, [Sour Cream, C... | $22.20 | 22.20 |
664 | 276 | 1 | Steak Salad | [Tomatillo-Red Chili Salsa (Hot), [Black Beans... | $8.99 | 8.99 |
Question 34
df의 item_name 컬럼 값이 Steak Salad 또는 Bowl 인 데이터를 데이터 프레임화 한 후, item_name를 기준으로 중복행이 있으면 제거하되 마지막 케이스만 남겨라
34번 유튜브 풀이
Show code cell source
Ans = df.loc[(df.item_name =='Steak Salad') | (df.item_name =='Bowl')]
Ans = Ans.drop_duplicates('item_name',keep='last')
Ans
order_id | quantity | item_name | choice_description | item_price | new_price | |
---|---|---|---|---|---|---|
673 | 279 | 1 | Bowl | [Adobo-Marinated and Grilled Steak, [Sour Crea... | $7.40 | 7.40 |
3502 | 1406 | 1 | Steak Salad | [[Lettuce, Fajita Veggies]] | $8.69 | 8.69 |
Question 35
df의 데이터 중 new_price값이 new_price값의 평균값 이상을 가지는 데이터들을 인덱싱하라
35번 유튜브 풀이
Show code cell source
Ans = df.loc[df.new_price >= df.new_price.mean()]
Ans.head(5)
order_id | quantity | item_name | choice_description | item_price | new_price | |
---|---|---|---|---|---|---|
4 | 2 | 2 | Chicken Bowl | [Tomatillo-Red Chili Salsa (Hot), [Black Beans... | $16.98 | 16.98 |
5 | 3 | 1 | Chicken Bowl | [Fresh Tomato Salsa (Mild), [Rice, Cheese, Sou... | $10.98 | 10.98 |
7 | 4 | 1 | Steak Burrito | [Tomatillo Red Chili Salsa, [Fajita Vegetables... | $11.75 | 11.75 |
8 | 4 | 1 | Steak Soft Tacos | [Tomatillo Green Chili Salsa, [Pinto Beans, Ch... | $9.25 | 9.25 |
9 | 5 | 1 | Steak Burrito | [Fresh Tomato Salsa, [Rice, Black Beans, Pinto... | $9.25 | 9.25 |
Question 36
df의 데이터 중 item_name의 값이 Izze 데이터를 Fizzy Lizzy로 수정하라
36번 유튜브 풀이
Show code cell source
df.loc[df.item_name =='Izze','item_name'] = 'Fizzy Lizzy'
Ans = df
Ans.head(3)
order_id | quantity | item_name | choice_description | item_price | new_price | |
---|---|---|---|---|---|---|
0 | 1 | 1 | Chips and Fresh Tomato Salsa | NaN | $2.39 | 2.39 |
1 | 1 | 1 | Fizzy Lizzy | [Clementine] | $3.39 | 3.39 |
2 | 1 | 1 | Nantucket Nectar | [Apple] | $3.39 | 3.39 |
Question 37
df의 데이터 중 choice_description 값이 NaN 인 데이터의 갯수를 구하여라
37번 유튜브 풀이
Show code cell source
Ans = df.choice_description.isnull().sum()
Ans
1246
Question 38
df의 데이터 중 choice_description 값이 NaN 인 데이터를 NoData 값으로 대체하라(loc 이용)
38번 유튜브 풀이
Show code cell source
df.loc[df.choice_description.isnull(),'choice_description'] ='NoData'
Ans = df
Ans.head()
order_id | quantity | item_name | choice_description | item_price | new_price | |
---|---|---|---|---|---|---|
0 | 1 | 1 | Chips and Fresh Tomato Salsa | NoData | $2.39 | 2.39 |
1 | 1 | 1 | Fizzy Lizzy | [Clementine] | $3.39 | 3.39 |
2 | 1 | 1 | Nantucket Nectar | [Apple] | $3.39 | 3.39 |
3 | 1 | 1 | Chips and Tomatillo-Green Chili Salsa | NoData | $2.39 | 2.39 |
4 | 2 | 2 | Chicken Bowl | [Tomatillo-Red Chili Salsa (Hot), [Black Beans... | $16.98 | 16.98 |
Question 39
df의 데이터 중 choice_description 값에 Black이 들어가는 경우를 인덱싱하라
39번 유튜브 풀이
Show code cell source
Ans = df[df.choice_description.str.contains('Black')]
Ans.head(5)
order_id | quantity | item_name | choice_description | item_price | new_price | |
---|---|---|---|---|---|---|
4 | 2 | 2 | Chicken Bowl | [Tomatillo-Red Chili Salsa (Hot), [Black Beans... | $16.98 | 16.98 |
7 | 4 | 1 | Steak Burrito | [Tomatillo Red Chili Salsa, [Fajita Vegetables... | $11.75 | 11.75 |
9 | 5 | 1 | Steak Burrito | [Fresh Tomato Salsa, [Rice, Black Beans, Pinto... | $9.25 | 9.25 |
11 | 6 | 1 | Chicken Crispy Tacos | [Roasted Chili Corn Salsa, [Fajita Vegetables,... | $8.75 | 8.75 |
12 | 6 | 1 | Chicken Soft Tacos | [Roasted Chili Corn Salsa, [Rice, Black Beans,... | $8.75 | 8.75 |
Question 40
df의 데이터 중 choice_description 값에 Vegetables 들어가지 않는 경우의 갯수를 출력하라
40번 유튜브 풀이
Show code cell source
Ans = len(df.loc[~df.choice_description.str.contains('Vegetables')])
Ans
3900
Question 41
df의 데이터 중 item_name 값이 N으로 시작하는 데이터를 모두 추출하라
41번 유튜브 풀이
Show code cell source
Ans = df[df.item_name.str.startswith('N')]
Ans.head(3)
order_id | quantity | item_name | choice_description | item_price | new_price | |
---|---|---|---|---|---|---|
2 | 1 | 1 | Nantucket Nectar | [Apple] | $3.39 | 3.39 |
22 | 11 | 1 | Nantucket Nectar | [Pomegranate Cherry] | $3.39 | 3.39 |
105 | 46 | 1 | Nantucket Nectar | [Pineapple Orange Banana] | $3.39 | 3.39 |
Question 42
df의 데이터 중 item_name 값의 단어갯수가 15개 이상인 데이터를 인덱싱하라
42번 유튜브 풀이
Show code cell source
Ans= df[df.item_name.str.len() >=15]
Ans.head(3)
order_id | quantity | item_name | choice_description | item_price | new_price | |
---|---|---|---|---|---|---|
0 | 1 | 1 | Chips and Fresh Tomato Salsa | NoData | $2.39 | 2.39 |
2 | 1 | 1 | Nantucket Nectar | [Apple] | $3.39 | 3.39 |
3 | 1 | 1 | Chips and Tomatillo-Green Chili Salsa | NoData | $2.39 | 2.39 |
Question 43
df의 데이터 중 new_price값이 lst에 해당하는 경우의 데이터 프레임을 구하고 그 갯수를 출력하라 lst =[1.69, 2.39, 3.39, 4.45, 9.25, 10.98, 11.75, 16.98]
43번 유튜브 풀이
lst =[1.69, 2.39, 3.39, 4.45, 9.25, 10.98, 11.75, 16.98]
Ans = df.loc[df.new_price.isin(lst)]
display(Ans.head(3))
print(len(Ans))
order_id | quantity | item_name | choice_description | item_price | new_price | |
---|---|---|---|---|---|---|
0 | 1 | 1 | Chips and Fresh Tomato Salsa | NoData | $2.39 | 2.39 |
1 | 1 | 1 | Fizzy Lizzy | [Clementine] | $3.39 | 3.39 |
2 | 1 | 1 | Nantucket Nectar | [Apple] | $3.39 | 3.39 |
1393
03_Grouping#
Attention
뉴욕 airBnB : https://www.kaggle.com/ptoscano230382/air-bnb-ny-2019 DataUrl = ‘https://raw.githubusercontent.com/Datamanim/pandas/main/AB_NYC_2019.csv’
Question 44
데이터를 로드하고 상위 5개 컬럼을 출력하라
44번 유튜브 풀이
df= pd.read_csv('https://raw.githubusercontent.com/Datamanim/pandas/main/AB_NYC_2019.csv')
Ans =df.head(5)
Ans
id | name | host_id | host_name | neighbourhood_group | neighbourhood | latitude | longitude | room_type | price | minimum_nights | number_of_reviews | last_review | reviews_per_month | calculated_host_listings_count | availability_365 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 2539 | Clean & quiet apt home by the park | 2787 | John | Brooklyn | Kensington | 40.64749 | -73.97237 | Private room | 149 | 1 | 9 | 2018-10-19 | 0.21 | 6 | 365 |
1 | 2595 | Skylit Midtown Castle | 2845 | Jennifer | Manhattan | Midtown | 40.75362 | -73.98377 | Entire home/apt | 225 | 1 | 45 | 2019-05-21 | 0.38 | 2 | 355 |
2 | 3647 | THE VILLAGE OF HARLEM....NEW YORK ! | 4632 | Elisabeth | Manhattan | Harlem | 40.80902 | -73.94190 | Private room | 150 | 3 | 0 | NaN | NaN | 1 | 365 |
3 | 3831 | Cozy Entire Floor of Brownstone | 4869 | LisaRoxanne | Brooklyn | Clinton Hill | 40.68514 | -73.95976 | Entire home/apt | 89 | 1 | 270 | 2019-07-05 | 4.64 | 1 | 194 |
4 | 5022 | Entire Apt: Spacious Studio/Loft by central park | 7192 | Laura | Manhattan | East Harlem | 40.79851 | -73.94399 | Entire home/apt | 80 | 10 | 9 | 2018-11-19 | 0.10 | 1 | 0 |
Question 45
데이터의 각 host_name의 빈도수를 구하고 host_name으로 정렬하여 상위 5개를 출력하라
45번 유튜브 풀이
Show code cell source
Ans = df.groupby('host_name').size()
# or
Ans = df.host_name.value_counts().sort_index()
Ans.head(5)
'Cil 1
(Ari) HENRY LEE 1
(Email hidden by Airbnb) 6
(Mary) Haiy 1
-TheQueensCornerLot 1
Name: host_name, dtype: int64
Question 46
데이터의 각 host_name의 빈도수를 구하고 빈도수 기준 내림차순 정렬한 데이터 프레임을 만들어라. 빈도수 컬럼은 counts로 명명하라
46번 유튜브 풀이
Show code cell source
Ans = df.groupby('host_name').size().\
to_frame().rename(columns={0:'counts'}).\
sort_values('counts',ascending=False)
Ans.head(5)
counts | |
---|---|
host_name | |
Michael | 417 |
David | 403 |
Sonder (NYC) | 327 |
John | 294 |
Alex | 279 |
Question 47
neighbourhood_group의 값에 따른 neighbourhood컬럼 값의 갯수를 구하여라
47번 유튜브 풀이
Show code cell source
Ans = df.groupby(['neighbourhood_group','neighbourhood'], as_index=False).size()
Ans.head(4)
neighbourhood_group | neighbourhood | size | |
---|---|---|---|
0 | Bronx | Allerton | 42 |
1 | Bronx | Baychester | 7 |
2 | Bronx | Belmont | 24 |
3 | Bronx | Bronxdale | 19 |
Question 48
neighbourhood_group의 값에 따른 neighbourhood컬럼 값 중 neighbourhood_group그룹의 최댓값들을 출력하라
48번 유튜브 풀이
Show code cell source
Ans= df.groupby(['neighbourhood_group','neighbourhood'], as_index=False).size()\
.groupby(['neighbourhood_group'], as_index=False).max()
Ans
neighbourhood_group | neighbourhood | size | |
---|---|---|---|
0 | Bronx | Woodlawn | 70 |
1 | Brooklyn | Windsor Terrace | 3920 |
2 | Manhattan | West Village | 2658 |
3 | Queens | Woodside | 900 |
4 | Staten Island | Woodrow | 48 |
Question 49
neighbourhood_group 값에 따른 price값의 평균, 분산, 최대, 최소 값을 구하여라
49번 유튜브 풀이
Show code cell source
Ans = df[['neighbourhood_group','price']].groupby('neighbourhood_group').agg(['mean','var','max','min'])
Ans
price | ||||
---|---|---|---|---|
mean | var | max | min | |
neighbourhood_group | ||||
Bronx | 87.496792 | 11386.885081 | 2500 | 0 |
Brooklyn | 124.383207 | 34921.719135 | 10000 | 0 |
Manhattan | 196.875814 | 84904.159185 | 10000 | 0 |
Queens | 99.517649 | 27923.130227 | 10000 | 10 |
Staten Island | 114.812332 | 77073.088342 | 5000 | 13 |
Question 50
neighbourhood_group 값에 따른 reviews_per_month 평균, 분산, 최대, 최소 값을 구하여라
50번 유튜브 풀이
Show code cell source
Ans = df[['neighbourhood_group','reviews_per_month']].groupby('neighbourhood_group').agg(['mean','var','max','min'])
Ans
reviews_per_month | ||||
---|---|---|---|---|
mean | var | max | min | |
neighbourhood_group | ||||
Bronx | 1.837831 | 2.799878 | 10.34 | 0.02 |
Brooklyn | 1.283212 | 2.299040 | 14.00 | 0.01 |
Manhattan | 1.272131 | 2.651206 | 58.50 | 0.01 |
Queens | 1.941200 | 4.897848 | 20.94 | 0.01 |
Staten Island | 1.872580 | 2.840895 | 10.12 | 0.02 |
Question 51
neighbourhood 값과 neighbourhood_group 값에 따른 price 의 평균을 구하라
51번 유튜브 풀이
Show code cell source
Ans = df.groupby(['neighbourhood','neighbourhood_group']).price.mean()
Ans
neighbourhood neighbourhood_group
Allerton Bronx 87.595238
Arden Heights Staten Island 67.250000
Arrochar Staten Island 115.000000
Arverne Queens 171.779221
Astoria Queens 117.187778
...
Windsor Terrace Brooklyn 138.993631
Woodhaven Queens 67.170455
Woodlawn Bronx 60.090909
Woodrow Staten Island 700.000000
Woodside Queens 85.097872
Name: price, Length: 221, dtype: float64
Question 52
neighbourhood 값과 neighbourhood_group 값에 따른 price 의 평균을 계층적 indexing 없이 구하라
52번 유튜브 풀이
Show code cell source
Ans = df.groupby(['neighbourhood','neighbourhood_group']).price.mean().unstack()
Ans
neighbourhood_group | Bronx | Brooklyn | Manhattan | Queens | Staten Island |
---|---|---|---|---|---|
neighbourhood | |||||
Allerton | 87.595238 | NaN | NaN | NaN | NaN |
Arden Heights | NaN | NaN | NaN | NaN | 67.25 |
Arrochar | NaN | NaN | NaN | NaN | 115.00 |
Arverne | NaN | NaN | NaN | 171.779221 | NaN |
Astoria | NaN | NaN | NaN | 117.187778 | NaN |
... | ... | ... | ... | ... | ... |
Windsor Terrace | NaN | 138.993631 | NaN | NaN | NaN |
Woodhaven | NaN | NaN | NaN | 67.170455 | NaN |
Woodlawn | 60.090909 | NaN | NaN | NaN | NaN |
Woodrow | NaN | NaN | NaN | NaN | 700.00 |
Woodside | NaN | NaN | NaN | 85.097872 | NaN |
221 rows × 5 columns
Question 53
neighbourhood 값과 neighbourhood_group 값에 따른 price 의 평균을 계층적 indexing 없이 구하고 nan 값은 -999값으로 채워라
53번 유튜브 풀이
Show code cell source
Ans = df.groupby(['neighbourhood','neighbourhood_group']).price.mean().unstack().fillna(-999)
Ans.head(4)
neighbourhood_group | Bronx | Brooklyn | Manhattan | Queens | Staten Island |
---|---|---|---|---|---|
neighbourhood | |||||
Allerton | 87.595238 | -999.0 | -999.0 | -999.000000 | -999.00 |
Arden Heights | -999.000000 | -999.0 | -999.0 | -999.000000 | 67.25 |
Arrochar | -999.000000 | -999.0 | -999.0 | -999.000000 | 115.00 |
Arverne | -999.000000 | -999.0 | -999.0 | 171.779221 | -999.00 |
Question 54
데이터중 neighbourhood_group 값이 Queens값을 가지는 데이터들 중 neighbourhood 그룹별로 price값의 평균, 분산, 최대, 최소값을 구하라
54번 유튜브 풀이
Show code cell source
Ans = df[df.neighbourhood_group=='Queens'].groupby(['neighbourhood']).price.agg(['mean','var','max','min'])
Ans.head(4)
mean | var | max | min | |
---|---|---|---|---|
neighbourhood | ||||
Arverne | 171.779221 | 37383.411141 | 1500 | 35 |
Astoria | 117.187778 | 122428.811196 | 10000 | 25 |
Bay Terrace | 142.000000 | 6816.400000 | 258 | 32 |
Bayside | 157.948718 | 166106.470985 | 2600 | 30 |
Question 55
데이터중 neighbourhood_group 값에 따른 room_type 컬럼의 숫자를 구하고 neighbourhood_group 값을 기준으로 각 값의 비율을 구하여라
55번 유튜브 풀이
Show code cell source
Ans = df[['neighbourhood_group','room_type']].groupby(['neighbourhood_group','room_type']).size().unstack()
Ans.loc[:,:] = (Ans.values /Ans.sum(axis=1).values.reshape(-1,1))
Ans
room_type | Entire home/apt | Private room | Shared room |
---|---|---|---|
neighbourhood_group | |||
Bronx | 0.347388 | 0.597617 | 0.054995 |
Brooklyn | 0.475478 | 0.503979 | 0.020543 |
Manhattan | 0.609344 | 0.368496 | 0.022160 |
Queens | 0.369926 | 0.595129 | 0.034945 |
Staten Island | 0.471850 | 0.504021 | 0.024129 |
04_Apply , Map#
Attention
카드이용데이터 : https://www.kaggle.com/sakshigoyal7/credit-card-customers DataUrl = ‘https://raw.githubusercontent.com/Datamanim/pandas/main/BankChurnersUp.csv’
Question 56
데이터를 로드하고 데이터 행과 열의 갯수를 출력하라
56번 유튜브 풀이
Show code cell source
df =pd.read_csv('https://raw.githubusercontent.com/Datamanim/pandas/main/BankChurnersUp.csv',index_col=0)
Ans =df.shape
Ans
(10127, 18)
Question 57
Income_Category의 카테고리를 map 함수를 이용하여 다음과 같이 변경하여 newIncome 컬럼에 매핑하라
Unknown : N
Less than $40K : a
$40K - $60K : b
$60K - $80K : c
$80K - $120K : d
$120K +’ : e
57번 유튜브 풀이
Show code cell source
dic = {
'Unknown' : 'N',
'Less than $40K' : 'a',
'$40K - $60K' : 'b',
'$60K - $80K' : 'c',
'$80K - $120K' : 'd',
'$120K +' : 'e'
}
df['newIncome'] =df.Income_Category.map(lambda x: dic[x])
Ans = df['newIncome']
Ans.head(4)
0 c
1 a
2 d
3 a
Name: newIncome, dtype: object
Question 58
Income_Category의 카테고리를 apply 함수를 이용하여 다음과 같이 변경하여 newIncome 컬럼에 매핑하라
Unknown : N
Less than $40K : a
$40K - $60K : b
$60K - $80K : c
$80K - $120K : d
$120K +’ : e
58번 유튜브 풀이
def changeCategory(x):
if x =='Unknown':
return 'N'
elif x =='Less than $40K':
return 'a'
elif x =='$40K - $60K':
return 'b'
elif x =='$60K - $80K':
return 'c'
elif x =='$80K - $120K':
return 'd'
elif x =='$120K +' :
return 'e'
df['newIncome'] =df.Income_Category.apply(changeCategory)
Ans = df['newIncome']
Ans.head(4)
0 c
1 a
2 d
3 a
Name: newIncome, dtype: object
Question 59
Customer_Age의 값을 이용하여 나이 구간을 AgeState 컬럼으로 정의하라. (0~9 : 0 , 10~19 :10 , 20~29 :20 … 각 구간의 빈도수를 출력하라
59번 유튜브 풀이
Show code cell source
df['AgeState'] = df.Customer_Age.map(lambda x: x//10 *10)
Ans = df['AgeState'].value_counts().sort_index()
Ans
20 195
30 1841
40 4561
50 2998
60 530
70 2
Name: AgeState, dtype: int64
Question 60
Education_Level의 값중 Graduate단어가 포함되는 값은 1 그렇지 않은 경우에는 0으로 변경하여 newEduLevel 컬럼을 정의하고 빈도수를 출력하라
60번 유튜브 풀이
Show code cell source
df['newEduLevel'] = df.Education_Level.map(lambda x : 1 if 'Graduate' in x else 0)
Ans = df['newEduLevel'].value_counts()
Ans
0 6483
1 3644
Name: newEduLevel, dtype: int64
Question 61
Credit_Limit 컬럼값이 4500 이상인 경우 1 그외의 경우에는 모두 0으로 하는 newLimit 정의하라. newLimit 각 값들의 빈도수를 출력하라
61번 유튜브 풀이
Show code cell source
df['newLimit'] = df.Credit_Limit.map(lambda x : 1 if x>=4500 else 0)
Ans = df['newLimit'].value_counts()
Ans
1 5096
0 5031
Name: newLimit, dtype: int64
Question 62
Marital_Status 컬럼값이 Married 이고 Card_Category 컬럼의 값이 Platinum인 경우 1 그외의 경우에는 모두 0으로 하는 newState컬럼을 정의하라. newState의 각 값들의 빈도수를 출력하라
62번 유튜브 풀이
Show code cell source
def check(x):
if x.Marital_Status =='Married' and x.Card_Category =='Platinum':
return 1
else:
return 0
df['newState'] = df.apply(check,axis=1)
Ans = df['newState'].value_counts()
Ans
0 10120
1 7
Name: newState, dtype: int64
Question 63
Gender 컬럼값 M인 경우 male F인 경우 female로 값을 변경하여 Gender 컬럼에 새롭게 정의하라. 각 value의 빈도를 출력하라
63번 유튜브 풀이
Show code cell source
def changeGender(x):
if x =='M':
return 'male'
else:
return 'female'
df['Gender'] = df.Gender.apply(changeGender)
Ans = df['Gender'].value_counts()
Ans
female 5358
male 4769
Name: Gender, dtype: int64
05_Time_Series#
Attention
주가 데이터 : https://raw.githubusercontent.com/guipsamora/pandas_exercises/master/06_Stats/Wind_Stats/wind.data DataUrl = ‘https://raw.githubusercontent.com/Datamanim/pandas/main/timeTest.csv’
Question 64
데이터를 로드하고 각 열의 데이터 타입을 파악하라
64번 유튜브 풀이
Show code cell source
df = pd.read_csv('https://raw.githubusercontent.com/Datamanim/pandas/main/timeTest.csv')
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 6574 entries, 0 to 6573
Data columns (total 13 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Yr_Mo_Dy 6574 non-null object
1 RPT 6568 non-null float64
2 VAL 6571 non-null float64
3 ROS 6572 non-null float64
4 KIL 6569 non-null float64
5 SHA 6572 non-null float64
6 BIR 6574 non-null float64
7 DUB 6571 non-null float64
8 CLA 6572 non-null float64
9 MUL 6571 non-null float64
10 CLO 6573 non-null float64
11 BEL 6574 non-null float64
12 MAL 6570 non-null float64
dtypes: float64(12), object(1)
memory usage: 667.8+ KB
Question 65
Yr_Mo_Dy을 판다스에서 인식할 수 있는 datetime64타입으로 변경하라
65번 유튜브 풀이
Show code cell source
df.Yr_Mo_Dy = pd.to_datetime(df.Yr_Mo_Dy)
Ans = df.Yr_Mo_Dy
Ans.head(4)
0 2061-01-01
1 2061-01-02
2 2061-01-03
3 2061-01-04
Name: Yr_Mo_Dy, dtype: datetime64[ns]
Question 66
Yr_Mo_Dy에 존재하는 년도의 유일값을 모두 출력하라
66번 유튜브 풀이
Show code cell source
Ans = df.Yr_Mo_Dy.dt.year.unique()
Ans
array([2061, 2062, 2063, 2064, 2065, 2066, 2067, 2068, 2069, 2070, 1971,
1972, 1973, 1974, 1975, 1976, 1977, 1978])
Question 67
Yr_Mo_Dy에 년도가 2061년 이상의 경우에는 모두 잘못된 데이터이다. 해당경우의 값은 100을 빼서 새롭게 날짜를 Yr_Mo_Dy 컬럼에 정의하라
67번 유튜브 풀이
Show code cell source
def fix_century(x):
import datetime
year = x.year - 100 if x.year >= 2061 else x.year
return pd.to_datetime(datetime.date(year, x.month, x.day))
df['Yr_Mo_Dy'] = df['Yr_Mo_Dy'].apply(fix_century)
Ans = df.head(4)
Ans
Yr_Mo_Dy | RPT | VAL | ROS | KIL | SHA | BIR | DUB | CLA | MUL | CLO | BEL | MAL | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1961-01-01 | 15.04 | 14.96 | 13.17 | 9.29 | NaN | 9.87 | 13.67 | 10.25 | 10.83 | 12.58 | 18.50 | 15.04 |
1 | 1961-01-02 | 14.71 | NaN | 10.83 | 6.50 | 12.62 | 7.67 | 11.50 | 10.04 | 9.79 | 9.67 | 17.54 | 13.83 |
2 | 1961-01-03 | 18.50 | 16.88 | 12.33 | 10.13 | 11.17 | 6.17 | 11.25 | NaN | 8.50 | 7.67 | 12.75 | 12.71 |
3 | 1961-01-04 | 10.58 | 6.63 | 11.75 | 4.58 | 4.54 | 2.88 | 8.63 | 1.79 | 5.83 | 5.88 | 5.46 | 10.88 |
Question 68
년도별 각컬럼의 평균값을 구하여라
68번 유튜브 풀이
Show code cell source
Ans = df.groupby(df.Yr_Mo_Dy.dt.year).mean()
Ans.head(4)
RPT | VAL | ROS | KIL | SHA | BIR | DUB | CLA | MUL | CLO | BEL | MAL | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
Yr_Mo_Dy | ||||||||||||
1961 | 12.299583 | 10.351796 | 11.362369 | 6.958227 | 10.881763 | 7.729726 | 9.733923 | 8.858788 | 8.647652 | 9.835577 | 13.502795 | 13.680773 |
1962 | 12.246923 | 10.110438 | 11.732712 | 6.960440 | 10.657918 | 7.393068 | 11.020712 | 8.793753 | 8.316822 | 9.676247 | 12.930685 | 14.323956 |
1963 | 12.813452 | 10.836986 | 12.541151 | 7.330055 | 11.724110 | 8.434712 | 11.075699 | 10.336548 | 8.903589 | 10.224438 | 13.638877 | 14.999014 |
1964 | 12.363661 | 10.920164 | 12.104372 | 6.787787 | 11.454481 | 7.570874 | 10.259153 | 9.467350 | 7.789016 | 10.207951 | 13.740546 | 14.910301 |
Question 69
weekday컬럼을 만들고 요일별로 매핑하라 ( 월요일: 0 ~ 일요일 :6)
69번 유튜브 풀이
Show code cell source
df['weekday'] = df.Yr_Mo_Dy.dt.weekday
Ans = df['weekday'].head(3).to_frame()
Ans
weekday | |
---|---|
0 | 6 |
1 | 0 |
2 | 1 |
Question 70
weekday컬럼을 기준으로 주말이면 1 평일이면 0의 값을 가지는 WeekCheck 컬럼을 만들어라
70번 유튜브 풀이
Show code cell source
df['WeekCheck'] = df['weekday'].map(lambda x : 1 if x in [5,6] else 0)
Ans = df['WeekCheck'].head(3).to_frame()
Ans
WeekCheck | |
---|---|
0 | 1 |
1 | 0 |
2 | 0 |
Question 71
년도, 일자 상관없이 모든 컬럼의 각 달의 평균을 구하여라
71번 유튜브 풀이
Show code cell source
Ans = df.groupby(df.Yr_Mo_Dy.dt.month).mean()
Ans.head(4)
RPT | VAL | ROS | KIL | SHA | BIR | DUB | CLA | MUL | CLO | BEL | MAL | weekday | WeekCheck | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Yr_Mo_Dy | ||||||||||||||
1 | 14.847325 | 12.914560 | 13.299624 | 7.199498 | 11.667734 | 8.054839 | 11.819355 | 9.512047 | 9.543208 | 10.053566 | 14.550520 | 18.028763 | 2.989247 | 0.284946 |
2 | 13.710906 | 12.111122 | 12.879132 | 6.942411 | 11.551772 | 7.633858 | 11.206024 | 9.341437 | 9.313169 | 9.518051 | 13.728898 | 17.156142 | 3.005906 | 0.287402 |
3 | 13.158687 | 11.505842 | 12.648118 | 7.265907 | 11.554516 | 7.959409 | 11.310179 | 9.635896 | 9.700324 | 10.096953 | 13.810609 | 16.909317 | 3.000000 | 0.283154 |
4 | 12.555648 | 10.429759 | 12.204815 | 6.898037 | 10.677667 | 7.441389 | 10.221315 | 8.909056 | 8.930870 | 9.158019 | 12.664759 | 14.937611 | 3.011111 | 0.288889 |
Question 72
모든 결측치는 컬럼기준 직전의 값으로 대체하고 첫번째 행에 결측치가 있을경우 뒤에있는 값으로 대채하라
72번 유튜브 풀이
Show code cell source
df = df.fillna(method='ffill').fillna(method='bfill')
df.isnull().sum()
Yr_Mo_Dy 0
RPT 0
VAL 0
ROS 0
KIL 0
SHA 0
BIR 0
DUB 0
CLA 0
MUL 0
CLO 0
BEL 0
MAL 0
weekday 0
WeekCheck 0
dtype: int64
Question 73
년도 - 월을 기준으로 모든 컬럼의 평균값을 구하여라
73번 유튜브 풀이
Show code cell source
Ans = df.groupby(df.Yr_Mo_Dy.dt.to_period('M')).mean()
Ans.head(3)
RPT | VAL | ROS | KIL | SHA | BIR | DUB | CLA | MUL | CLO | BEL | MAL | weekday | WeekCheck | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Yr_Mo_Dy | ||||||||||||||
1961-01 | 14.932581 | 12.084194 | 13.431613 | 7.736774 | 11.215806 | 8.588065 | 11.184839 | 9.270968 | 9.085806 | 10.107419 | 13.880968 | 14.703226 | 2.935484 | 0.290323 |
1961-02 | 16.269286 | 14.975357 | 14.324643 | 9.116786 | 13.852143 | 10.937500 | 11.890714 | 11.846071 | 11.821429 | 12.714286 | 18.583214 | 15.411786 | 3.000000 | 0.285714 |
1961-03 | 11.015806 | 11.296452 | 10.752903 | 7.137742 | 10.509355 | 8.866774 | 9.644194 | 9.829677 | 10.646129 | 11.251935 | 16.410968 | 15.637742 | 3.000000 | 0.258065 |
Question 74
RPT 컬럼의 값을 일자별 기준으로 1차차분하라
74번 유튜브 풀이
Show code cell source
Ans = df['RPT'].diff()
Ans.head(3)
0 NaN
1 -0.33
2 3.79
Name: RPT, dtype: float64
Question 75
RPT와 VAL의 컬럼을 일주일 간격으로 각각 이동평균한값을 구하여라
75번 유튜브 풀이
Show code cell source
Ans= df[['RPT','VAL']].rolling(7).mean()
Ans.head(9)
RPT | VAL | |
---|---|---|
0 | NaN | NaN |
1 | NaN | NaN |
2 | NaN | NaN |
3 | NaN | NaN |
4 | NaN | NaN |
5 | NaN | NaN |
6 | 14.124286 | 12.727143 |
7 | 13.541429 | 11.982857 |
8 | 13.237143 | 11.392857 |
Attention
서울시 미세먼지 데이터 : https://www.airkorea.or.kr/web/realSearch?pMENU_NO=97 DataUrl = ‘https://raw.githubusercontent.com/Datamanim/pandas/main/seoul_pm.csv’
df =pd.read_csv('https://raw.githubusercontent.com/Datamanim/pandas/main/seoul_pm.csv')
Question 76
년-월-일:시 컬럼을 pandas에서 인식할 수 있는 datetime 형태로 변경하라. 서울시의 제공데이터의 경우 0시가 24시로 표현된다
76번 유튜브 풀이
Show code cell source
def change_date(x):
import datetime
hour = x.split(':')[1]
date = x.split(":")[0]
if hour =='24':
hour ='00:00:00'
FinalDate = pd.to_datetime(date +" "+hour) +datetime.timedelta(days=1)
else:
hour = hour +':00:00'
FinalDate = pd.to_datetime(date +" "+hour)
return FinalDate
df['(년-월-일:시)'] = df['(년-월-일:시)'].apply(change_date)
Ans = df
Ans.head(3)
(년-월-일:시) | PM10등급 | PM10 | PM2.5등급 | PM2.5 | 오존등급 | 오존 | 이산화질소등급 | 이산화질소 | 일산화탄소등급 | 일산화탄소 | 아황산가스등급 | 아황산가스 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 2021-05-15 15:00:00 | 보통 | 47.0 | 보통 | 19.0 | 좋음 | 0.017 | 좋음 | 0.023 | 좋음 | 0.4 | 좋음 | 0.003 |
1 | 2021-05-15 14:00:00 | 보통 | 43.0 | 보통 | 20.0 | 좋음 | 0.024 | 좋음 | 0.019 | 좋음 | 0.3 | 좋음 | 0.003 |
2 | 2021-05-15 13:00:00 | 보통 | 34.0 | 보통 | 24.0 | 보통 | 0.035 | 좋음 | 0.017 | 좋음 | 0.4 | 좋음 | 0.004 |
Question 77
일자별 영어요일 이름을 dayName 컬럼에 저장하라
77번 유튜브 풀이
Show code cell source
df['dayName'] =df['(년-월-일:시)'].dt.day_name()
Ans =df['dayName']
Ans.head(5)
0 Saturday
1 Saturday
2 Saturday
3 Saturday
4 Saturday
Name: dayName, dtype: object
Question 78
일자별 각 PM10등급의 빈도수를 파악하라
78번 유튜브 풀이
Show code cell source
Ans1 = df.groupby(['dayName','PM10등급'],as_index=False).size()
Ans2 = Ans1.pivot(index='dayName',columns='PM10등급',values='size').fillna(0)
Ans1.head()
dayName | PM10등급 | size | |
---|---|---|---|
0 | Friday | 나쁨 | 31 |
1 | Friday | 매우나쁨 | 17 |
2 | Friday | 보통 | 120 |
3 | Friday | 좋음 | 21 |
4 | Monday | 나쁨 | 1 |
Ans2
PM10등급 | 나쁨 | 매우나쁨 | 보통 | 좋음 |
---|---|---|---|---|
dayName | ||||
Friday | 31.0 | 17.0 | 120.0 | 21.0 |
Monday | 1.0 | 21.0 | 83.0 | 63.0 |
Saturday | 31.0 | 27.0 | 71.0 | 54.0 |
Sunday | 2.0 | 1.0 | 67.0 | 98.0 |
Thursday | 41.0 | 0.0 | 144.0 | 5.0 |
Tuesday | 13.0 | 10.0 | 71.0 | 74.0 |
Wednesday | 26.0 | 0.0 | 95.0 | 46.0 |
Question 79
시간이 연속적으로 존재하며 결측치가 없는지 확인하라
79번 유튜브 풀이
Show code cell source
# 시간을 차분했을 경우 첫 값은 nan, 이후 모든 차분값이 동일하면 연속이라 판단한다.
check = len(df['(년-월-일:시)'].diff().unique())
if check ==2:
Ans =True
else:
Ans = False
Ans
True
Question 80
오전 10시와 오후 10시(22시)의 PM10의 평균값을 각각 구하여라
80번 유튜브 풀이
Show code cell source
Ans = df.groupby(df['(년-월-일:시)'].dt.hour).mean().iloc[[10,22],[0]]
Ans
PM10 | |
---|---|
(년-월-일:시) | |
10 | 70.384615 |
22 | 69.941176 |
Question 81
날짜 컬럼을 index로 만들어라
81번 유튜브 풀이
Show code cell source
df.set_index('(년-월-일:시)',inplace=True,drop=True)
Ans =df
Ans.head(3)
PM10등급 | PM10 | PM2.5등급 | PM2.5 | 오존등급 | 오존 | 이산화질소등급 | 이산화질소 | 일산화탄소등급 | 일산화탄소 | 아황산가스등급 | 아황산가스 | dayName | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
(년-월-일:시) | |||||||||||||
2021-05-15 15:00:00 | 보통 | 47.0 | 보통 | 19.0 | 좋음 | 0.017 | 좋음 | 0.023 | 좋음 | 0.4 | 좋음 | 0.003 | Saturday |
2021-05-15 14:00:00 | 보통 | 43.0 | 보통 | 20.0 | 좋음 | 0.024 | 좋음 | 0.019 | 좋음 | 0.3 | 좋음 | 0.003 | Saturday |
2021-05-15 13:00:00 | 보통 | 34.0 | 보통 | 24.0 | 보통 | 0.035 | 좋음 | 0.017 | 좋음 | 0.4 | 좋음 | 0.004 | Saturday |
Question 82
데이터를 주단위로 뽑아서 최소,최대 평균, 표준표차를 구하여라
82번 유튜브 풀이
Show code cell source
Ans = df.resample('W').agg(['min','max','mean','std'])
Ans.head(5)
PM10 | PM2.5 | 오존 | ... | 이산화질소 | 일산화탄소 | 아황산가스 | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
min | max | mean | std | min | max | mean | std | min | max | ... | mean | std | min | max | mean | std | min | max | mean | std | |
(년-월-일:시) | |||||||||||||||||||||
2021-03-28 | 6.0 | 160.0 | 72.747368 | 43.345462 | 4.0 | 113.0 | 44.705263 | 29.551928 | 0.002 | 0.085 | ... | 0.044579 | 0.023722 | 0.3 | 1.4 | 0.611579 | 0.232408 | 0.002 | 0.006 | 0.003274 | 0.000961 |
2021-04-04 | 3.0 | 598.0 | 97.148810 | 129.911976 | 1.0 | 120.0 | 23.168675 | 22.399578 | 0.003 | 0.055 | ... | 0.027929 | 0.014978 | 0.3 | 0.9 | 0.445833 | 0.135741 | 0.002 | 0.004 | 0.002732 | 0.000541 |
2021-04-11 | 17.0 | 102.0 | 41.059524 | 16.325911 | 7.0 | 70.0 | 21.761905 | 11.479343 | 0.009 | 0.070 | ... | 0.022583 | 0.009562 | 0.3 | 0.7 | 0.389286 | 0.087573 | 0.002 | 0.004 | 0.002744 | 0.000569 |
2021-04-18 | 3.0 | 367.0 | 48.180723 | 43.254468 | 2.0 | 38.0 | 17.066265 | 7.867952 | 0.002 | 0.070 | ... | 0.023753 | 0.013553 | 0.3 | 0.6 | 0.386747 | 0.084954 | 0.002 | 0.004 | 0.002464 | 0.000579 |
2021-04-25 | 17.0 | 126.0 | 55.119048 | 26.659936 | 7.0 | 61.0 | 26.392857 | 13.094788 | 0.006 | 0.090 | ... | 0.028571 | 0.014640 | 0.3 | 0.8 | 0.457143 | 0.122142 | 0.001 | 0.011 | 0.003631 | 0.001763 |
5 rows × 24 columns
06_Pivot#
Attention
국가별 5세이하 사망비율 통계 : https://www.kaggle.com/utkarshxy/who-worldhealth-statistics-2020-complete Dataurl = ‘https://raw.githubusercontent.com/Datamanim/pandas/main/under5MortalityRate.csv’
df = pd.read_csv('https://raw.githubusercontent.com/Datamanim/pandas/main/under5MortalityRate.csv')
Question 83
Indicator을 삭제하고 First Tooltip 컬럼에서 신뢰구간에 해당하는 표현을 지워라
83번 유튜브 풀이
Show code cell source
df.drop('Indicator',axis=1,inplace=True)
df['First Tooltip'] = df['First Tooltip'].map(lambda x: float(x.split("[")[0]))
Ans = df
Ans.head(4)
Location | Period | Dim1 | First Tooltip | |
---|---|---|---|---|
0 | Afghanistan | 2019 | Both sexes | 60.27 |
1 | Afghanistan | 2019 | Male | 63.83 |
2 | Afghanistan | 2019 | Female | 56.57 |
3 | Afghanistan | 2018 | Both sexes | 62.54 |
Question 84
년도가 2015년 이상, Dim1이 Both sexes인 케이스만 추출하라
84번 유튜브 풀이
Show code cell source
target = df[(df.Period >=2015) & (df.Dim1 =='Both sexes')]
Ans = target
Ans.head(3)
Location | Period | Dim1 | First Tooltip | |
---|---|---|---|---|
0 | Afghanistan | 2019 | Both sexes | 60.27 |
3 | Afghanistan | 2018 | Both sexes | 62.54 |
6 | Afghanistan | 2017 | Both sexes | 64.94 |
Question 85
84번 문제에서 추출한 데이터로 아래와 같이 나라에 따른 년도별 사망률을 데이터 프레임화 하라
85번 유튜브 풀이
Show code cell source
Ans = target.pivot(index='Location',columns='Period',values='First Tooltip')
Ans.head(3)
Period | 2015 | 2016 | 2017 | 2018 | 2019 |
---|---|---|---|---|---|
Location | |||||
Afghanistan | 70.44 | 67.57 | 64.94 | 62.54 | 60.27 |
Albania | 9.57 | 9.42 | 9.42 | 9.53 | 9.68 |
Algeria | 25.18 | 24.79 | 24.32 | 23.81 | 23.26 |
Question 86
Dim1에 따른 년도별 사망비율의 평균을 구하라
86번 유튜브 풀이
Show code cell source
Ans = df.pivot_table(index='Dim1',columns='Period',values='First Tooltip',aggfunc='mean')
Ans.iloc[:,:4]
Period | 1950 | 1951 | 1952 | 1953 |
---|---|---|---|---|
Dim1 | ||||
Both sexes | 147.700816 | 155.537544 | 157.811094 | 156.147206 |
Female | 140.909796 | 149.210175 | 151.516094 | 150.250882 |
Male | 154.151224 | 161.538246 | 163.760781 | 161.742059 |
Attention
올림픽 메달리스트 정보 데이터: https://www.kaggle.com/the-guardian/olympic-games dataUrl =’https://raw.githubusercontent.com/Datamanim/pandas/main/winter.csv’
df = pd.read_csv('https://raw.githubusercontent.com/Datamanim/pandas/main/winter.csv')
Question 87
데이터에서 한국 KOR 데이터만 추출하라
87번 유튜브 풀이
Show code cell source
kr = df[df.Country=='KOR']
Ans = kr
Ans.head(4)
Year | City | Sport | Discipline | Athlete | Country | Gender | Event | Medal | |
---|---|---|---|---|---|---|---|---|---|
2652 | 1992 | Albertville | Skating | Short Track Speed Skating | LEE, Jun-Ho | KOR | Men | 1000M | Bronze |
2653 | 1992 | Albertville | Skating | Short Track Speed Skating | KIM, Ki-Hoon | KOR | Men | 1000M | Gold |
2671 | 1992 | Albertville | Skating | Short Track Speed Skating | KIM, Ki-Hoon | KOR | Men | 5000M Relay | Gold |
2672 | 1992 | Albertville | Skating | Short Track Speed Skating | LEE, Jun-Ho | KOR | Men | 5000M Relay | Gold |
Question 88
한국 올림픽 메달리스트 데이터에서 년도에 따른 medal 갯수를 데이터프레임화 하라
88번 유튜브 풀이
Show code cell source
Ans = kr.pivot_table(index='Year',columns='Medal',aggfunc='size').fillna(0)
Ans
Medal | Bronze | Gold | Silver |
---|---|---|---|
Year | |||
1992 | 1.0 | 5.0 | 1.0 |
1994 | 1.0 | 8.0 | 1.0 |
1998 | 2.0 | 6.0 | 4.0 |
2002 | 0.0 | 5.0 | 2.0 |
2006 | 2.0 | 14.0 | 3.0 |
2010 | 2.0 | 6.0 | 10.0 |
2014 | 2.0 | 7.0 | 5.0 |
Question 89
전체 데이터에서 sport종류에 따른 성별수를 구하여라
89번 유튜브 풀이
Show code cell source
Ans = df.pivot_table(index='Sport',columns='Gender',aggfunc='size')
Ans
Gender | Men | Women |
---|---|---|
Sport | ||
Biathlon | 270 | 150 |
Bobsleigh | 416 | 36 |
Curling | 97 | 75 |
Ice Hockey | 1231 | 305 |
Luge | 135 | 45 |
Skating | 665 | 564 |
Skiing | 1130 | 651 |
Question 90
전체 데이터에서 Discipline종류에 따른 따른 Medal수를 구하여라
90번 유튜브 풀이
Show code cell source
Ans = df.pivot_table(index='Discipline',columns='Medal',aggfunc='size')
Ans
Medal | Bronze | Gold | Silver |
---|---|---|---|
Discipline | |||
Alpine Skiing | 141 | 143 | 144 |
Biathlon | 139 | 140 | 141 |
Bobsleigh | 147 | 134 | 141 |
Cross Country Skiing | 263 | 264 | 262 |
Curling | 56 | 58 | 58 |
Figure skating | 118 | 122 | 119 |
Freestyle Skiing | 34 | 34 | 34 |
Ice Hockey | 512 | 510 | 514 |
Luge | 60 | 62 | 58 |
Nordic Combined | 55 | 55 | 55 |
Short Track Speed Skating | 96 | 97 | 97 |
Skeleton | 10 | 10 | 10 |
Ski Jumping | 68 | 69 | 70 |
Snowboard | 30 | 30 | 30 |
Speed skating | 190 | 193 | 197 |
07_Merge , Concat#
Attention
국가별 5세이하 사망비율 통계 : https://www.kaggle.com/utkarshxy/who-worldhealth-statistics-2020-complete
데이터 변형
Dataurl = ‘https://raw.githubusercontent.com/Datamanim/pandas/main/mergeTEst.csv’
merge, concat 급종료 변명.. 유튜브 풀이
df = pd.read_csv('https://raw.githubusercontent.com/Datamanim/pandas/main/mergeTEst.csv',index_col= 0)
df1 = df.iloc[:4,:]
df2 = df.iloc[4:,:]
display(df1)
display(df2)
2010 | 2011 | 2012 | 2013 | 2014 | 2015 | 2016 | 2017 | 2018 | 2019 | |
---|---|---|---|---|---|---|---|---|---|---|
Location | ||||||||||
Afghanistan | 64.023 | 61.640 | 59.367 | 57.170 | 55.08 | 53.107 | 51.267 | 49.560 | 47.983 | 46.453 |
Albania | 11.803 | 10.807 | 9.943 | 9.267 | 8.79 | 8.493 | 8.363 | 8.363 | 8.453 | 8.597 |
Algeria | 23.540 | 22.907 | 22.450 | 22.117 | 21.85 | 21.587 | 21.257 | 20.850 | 20.407 | 19.930 |
Andorra | 4.240 | 4.033 | 3.843 | 3.667 | 3.49 | 3.330 | 3.187 | 3.060 | 2.933 | 2.827 |
2010 | 2011 | 2012 | 2013 | 2014 | 2015 | 2016 | 2017 | 2018 | 2019 | |
---|---|---|---|---|---|---|---|---|---|---|
Location | ||||||||||
Angola | 75.713 | 71.280 | 67.233 | 63.570 | 60.430 | 57.757 | 55.510 | 53.460 | 51.757 | 50.093 |
Antigua and Barbuda | 8.667 | 8.223 | 7.807 | 7.420 | 7.070 | 6.757 | 6.483 | 6.230 | 6.000 | 5.783 |
Argentina | 12.887 | 12.380 | 11.840 | 11.283 | 10.733 | 10.203 | 9.683 | 9.177 | 8.680 | 8.227 |
Armenia | 16.497 | 15.677 | 14.897 | 14.170 | 13.477 | 12.817 | 12.183 | 11.583 | 11.007 | 10.497 |
Australia | 3.993 | 3.803 | 3.623 | 3.467 | 3.343 | 3.253 | 3.183 | 3.137 | 3.090 | 3.047 |
Austria | 3.573 | 3.463 | 3.333 | 3.210 | 3.113 | 3.043 | 2.987 | 2.943 | 2.897 | 2.843 |
Question 91
df1과 df2 데이터를 하나의 데이터 프레임으로 합쳐라
Show code cell source
total = pd.concat([df1,df2])
Ans = total
Ans
2010 | 2011 | 2012 | 2013 | 2014 | 2015 | 2016 | 2017 | 2018 | 2019 | |
---|---|---|---|---|---|---|---|---|---|---|
Location | ||||||||||
Afghanistan | 64.023 | 61.640 | 59.367 | 57.170 | 55.080 | 53.107 | 51.267 | 49.560 | 47.983 | 46.453 |
Albania | 11.803 | 10.807 | 9.943 | 9.267 | 8.790 | 8.493 | 8.363 | 8.363 | 8.453 | 8.597 |
Algeria | 23.540 | 22.907 | 22.450 | 22.117 | 21.850 | 21.587 | 21.257 | 20.850 | 20.407 | 19.930 |
Andorra | 4.240 | 4.033 | 3.843 | 3.667 | 3.490 | 3.330 | 3.187 | 3.060 | 2.933 | 2.827 |
Angola | 75.713 | 71.280 | 67.233 | 63.570 | 60.430 | 57.757 | 55.510 | 53.460 | 51.757 | 50.093 |
Antigua and Barbuda | 8.667 | 8.223 | 7.807 | 7.420 | 7.070 | 6.757 | 6.483 | 6.230 | 6.000 | 5.783 |
Argentina | 12.887 | 12.380 | 11.840 | 11.283 | 10.733 | 10.203 | 9.683 | 9.177 | 8.680 | 8.227 |
Armenia | 16.497 | 15.677 | 14.897 | 14.170 | 13.477 | 12.817 | 12.183 | 11.583 | 11.007 | 10.497 |
Australia | 3.993 | 3.803 | 3.623 | 3.467 | 3.343 | 3.253 | 3.183 | 3.137 | 3.090 | 3.047 |
Austria | 3.573 | 3.463 | 3.333 | 3.210 | 3.113 | 3.043 | 2.987 | 2.943 | 2.897 | 2.843 |
df3 = df.iloc[:2,:4]
df4 = df.iloc[5:,3:]
display(df3)
display(df4)
2010 | 2011 | 2012 | 2013 | |
---|---|---|---|---|
Location | ||||
Afghanistan | 64.023 | 61.640 | 59.367 | 57.170 |
Albania | 11.803 | 10.807 | 9.943 | 9.267 |
2013 | 2014 | 2015 | 2016 | 2017 | 2018 | 2019 | |
---|---|---|---|---|---|---|---|
Location | |||||||
Antigua and Barbuda | 7.420 | 7.070 | 6.757 | 6.483 | 6.230 | 6.000 | 5.783 |
Argentina | 11.283 | 10.733 | 10.203 | 9.683 | 9.177 | 8.680 | 8.227 |
Armenia | 14.170 | 13.477 | 12.817 | 12.183 | 11.583 | 11.007 | 10.497 |
Australia | 3.467 | 3.343 | 3.253 | 3.183 | 3.137 | 3.090 | 3.047 |
Austria | 3.210 | 3.113 | 3.043 | 2.987 | 2.943 | 2.897 | 2.843 |
Question 92
df3과 df4 데이터를 하나의 데이터 프레임으로 합쳐라. 둘다 포함하고 있는 년도에 대해서만 고려한다
Show code cell source
Ans = pd.concat([df3,df4],join='inner')
Ans
2013 | |
---|---|
Location | |
Afghanistan | 57.170 |
Albania | 9.267 |
Antigua and Barbuda | 7.420 |
Argentina | 11.283 |
Armenia | 14.170 |
Australia | 3.467 |
Austria | 3.210 |
Question 93
df3과 df4 데이터를 하나의 데이터 프레임으로 합쳐라. 모든 컬럼을 포함하고, 결측치는 0으로 대체한다
Show code cell source
Ans = pd.concat([df3,df4],join='outer').fillna(0)
Ans
2010 | 2011 | 2012 | 2013 | 2014 | 2015 | 2016 | 2017 | 2018 | 2019 | |
---|---|---|---|---|---|---|---|---|---|---|
Location | ||||||||||
Afghanistan | 64.023 | 61.640 | 59.367 | 57.170 | 0.000 | 0.000 | 0.000 | 0.000 | 0.000 | 0.000 |
Albania | 11.803 | 10.807 | 9.943 | 9.267 | 0.000 | 0.000 | 0.000 | 0.000 | 0.000 | 0.000 |
Antigua and Barbuda | 0.000 | 0.000 | 0.000 | 7.420 | 7.070 | 6.757 | 6.483 | 6.230 | 6.000 | 5.783 |
Argentina | 0.000 | 0.000 | 0.000 | 11.283 | 10.733 | 10.203 | 9.683 | 9.177 | 8.680 | 8.227 |
Armenia | 0.000 | 0.000 | 0.000 | 14.170 | 13.477 | 12.817 | 12.183 | 11.583 | 11.007 | 10.497 |
Australia | 0.000 | 0.000 | 0.000 | 3.467 | 3.343 | 3.253 | 3.183 | 3.137 | 3.090 | 3.047 |
Austria | 0.000 | 0.000 | 0.000 | 3.210 | 3.113 | 3.043 | 2.987 | 2.943 | 2.897 | 2.843 |
df5 = df.T.iloc[:7,:3]
df6 = df.T.iloc[6:,2:5]
display(df5)
display(df6)
Location | Afghanistan | Albania | Algeria |
---|---|---|---|
2010 | 64.023 | 11.803 | 23.540 |
2011 | 61.640 | 10.807 | 22.907 |
2012 | 59.367 | 9.943 | 22.450 |
2013 | 57.170 | 9.267 | 22.117 |
2014 | 55.080 | 8.790 | 21.850 |
2015 | 53.107 | 8.493 | 21.587 |
2016 | 51.267 | 8.363 | 21.257 |
Location | Algeria | Andorra | Angola |
---|---|---|---|
2016 | 21.257 | 3.187 | 55.510 |
2017 | 20.850 | 3.060 | 53.460 |
2018 | 20.407 | 2.933 | 51.757 |
2019 | 19.930 | 2.827 | 50.093 |
Question 94
df5과 df6 데이터를 하나의 데이터 프레임으로 merge함수를 이용하여 합쳐라. Algeria컬럼을 key로 하고 두 데이터 모두 포함하는 데이터만 출력하라
Show code cell source
Ans = pd.merge(df5,df6,on='Algeria',how='inner')
Ans
Location | Afghanistan | Albania | Algeria | Andorra | Angola |
---|---|---|---|---|---|
0 | 51.267 | 8.363 | 21.257 | 3.187 | 55.51 |
Question 95
df5과 df6 데이터를 하나의 데이터 프레임으로 merge함수를 이용하여 합쳐라. Algeria컬럼을 key로 하고 합집합으로 합쳐라
Show code cell source
Ans =pd.merge(df5,df6,on='Algeria',how='outer')
Ans
Location | Afghanistan | Albania | Algeria | Andorra | Angola |
---|---|---|---|---|---|
0 | 64.023 | 11.803 | 23.540 | NaN | NaN |
1 | 61.640 | 10.807 | 22.907 | NaN | NaN |
2 | 59.367 | 9.943 | 22.450 | NaN | NaN |
3 | 57.170 | 9.267 | 22.117 | NaN | NaN |
4 | 55.080 | 8.790 | 21.850 | NaN | NaN |
5 | 53.107 | 8.493 | 21.587 | NaN | NaN |
6 | 51.267 | 8.363 | 21.257 | 3.187 | 55.510 |
7 | NaN | NaN | 20.850 | 3.060 | 53.460 |
8 | NaN | NaN | 20.407 | 2.933 | 51.757 |
9 | NaN | NaN | 19.930 | 2.827 | 50.093 |