-
chapter-7 깔끔한 데이터판다스 2021. 9. 23. 00:34
melt 메서드¶
판다스는 데이터프레임을 깔끔한 데이터로 정리하는 데 유용한 melt 메서드를 제공합니다. melt 메서드는 지정한 열의 데이터를 모두 행으로 정리해 줍니다. 다음은 melt 메서드를 실습할 때 사용할 인자를 정리한 표 입니다. 본격적인 실습을 진행하기 전에 미리 읽어 두면 도움이 될 것입니다.
melt 메서드의 인자¶
- 메서드인자:설명
- id_vars: 위치를 그대로 유지할 열의 이름을 지정합니다.
- value_vars: 행으로 위치를 변경할 열의 이름을 지정합니다.
- var_name: value_vars로 위치를 변경한 열의 이름을 지정합니다.
- value_name: var_name으로 위치를 변경한 열의 데이터를 저장한 열의 이름을 지정합니다.
In [53]:import pandas as pd pew=pd.read_csv('data/pew.csv') print(pew.head())
religion <$10k $10-20k $20-30k $30-40k $40-50k $50-75k \ 0 Agnostic 27 34 60 81 76 137 1 Atheist 12 27 37 52 35 70 2 Buddhist 27 21 30 34 33 58 3 Catholic 418 617 732 670 638 1116 4 Don’t know/refused 15 14 15 11 10 35 $75-100k $100-150k >150k Don't know/refused 0 122 109 84 96 1 73 59 74 76 2 62 39 53 54 3 949 792 633 1489 4 21 17 18 116
2.¶
6개의 열만 출력해 볼까요? 그러면 종교와 소득 정보가 출력됩니다. 하지만 이 상태는 소득 정보가 열을 구성하고 있죠. 만약 소득 정보 열을 행 데이터로 옴기고 싶다면 어떻게 해야 할까요?
In [7]:print(pew.iloc[:,0:6])
religion <$10k $10-20k $20-30k $30-40k $40-50k 0 Agnostic 27 34 60 81 76 1 Atheist 12 27 37 52 35 2 Buddhist 27 21 30 34 33 3 Catholic 418 617 732 670 638 4 Don’t know/refused 15 14 15 11 10 5 Evangelical Prot 575 869 1064 982 881 6 Hindu 1 9 7 9 11 7 Historically Black Prot 228 244 236 238 197 8 Jehovah's Witness 20 27 24 24 21 9 Jewish 19 19 25 25 30 10 Mainline Prot 289 495 619 655 651 11 Mormon 29 40 48 51 56 12 Muslim 6 7 9 10 9 13 Orthodox 13 17 23 32 32 14 Other Christian 9 7 11 13 13 15 Other Faiths 20 33 40 46 49 16 Other World Religions 5 2 3 4 2 17 Unaffiliated 217 299 374 365 341
3.¶
다음을 입력하여 결과를 살펴볼까요? 어떻게 되었나요? id_vars 인잣값으로 지정한 열을 제외한 나머지 소득 정보 열이 variable열로 정리되고 소득정보 열의 행 데이터도 value 열로 정리되었씁니다. 바로 이 과정을 'religion 열을 고정하여 피벗했다'라고 말합니다.
In [8]:pew_long=pd.melt(pew,id_vars='religion') print(pew_long.head())
religion variable value 0 Agnostic <$10k 27 1 Atheist <$10k 12 2 Buddhist <$10k 27 3 Catholic <$10k 418 4 Don’t know/refused <$10k 15
4.¶
그러면 variable, value 열의 열 이름은 어떻게 바꿀 수 있을까요? var_name, value_name 인잣값을 사용하면 됩니다. 다음은 variabel, value라는 열 이름을 income, count로 재설정한 코드입니다.
In [11]:pew_long=pd.melt(pew, id_vars='religion', var_name='income', value_name='count') print(pew_long.head())
religion income count 0 Agnostic <$10k 27 1 Atheist <$10k 12 2 Buddhist <$10k 27 3 Catholic <$10k 418 4 Don’t know/refused <$10k 15
5. 2개 이상의 열을 고정하고 나머지 열을 행으로 바꾸기¶
이번에는 빌보드 차트 데이터를 사용하여 실습을 진행하겠습니다. 2개 이상의 열을 고정하고 나머지 열을 행으로 바꾸면 어떻게 될까요? 다음은 빌보드 차트의 데이터 집합을 불러온 다음 데이터를 확인한 것입니다. 빌보드 차트 데이터프레임이 어떻게 구성되어 있는지 확인해 보세요.
In [12]:billboard=pd.read_csv('data/billboard.csv') print(billboard.iloc[0:5,0:16])
year artist track time date.entered wk1 wk2 \ 0 2000 2 Pac Baby Don't Cry (Keep... 4:22 2000-02-26 87 82.0 1 2000 2Ge+her The Hardest Part Of ... 3:15 2000-09-02 91 87.0 2 2000 3 Doors Down Kryptonite 3:53 2000-04-08 81 70.0 3 2000 3 Doors Down Loser 4:24 2000-10-21 76 76.0 4 2000 504 Boyz Wobble Wobble 3:35 2000-04-15 57 34.0 wk3 wk4 wk5 wk6 wk7 wk8 wk9 wk10 wk11 0 72.0 77.0 87.0 94.0 99.0 NaN NaN NaN NaN 1 92.0 NaN NaN NaN NaN NaN NaN NaN NaN 2 68.0 67.0 66.0 57.0 54.0 53.0 51.0 51.0 51.0 3 72.0 69.0 67.0 65.0 55.0 59.0 62.0 61.0 61.0 4 25.0 17.0 17.0 31.0 36.0 49.0 53.0 57.0 64.0
6.¶
다음은 year, artist, track, time, date.entered 열을 모두 고정하고 나머지 열을 피벗한 것입니다.
In [16]:billboard_long=pd.melt(billboard, id_vars=['year', 'artist', 'track', 'time', 'date.entered'], var_name='week', value_name='rating') print(billboard_long.head())
year artist track time date.entered week rating 0 2000 2 Pac Baby Don't Cry (Keep... 4:22 2000-02-26 wk1 87.0 1 2000 2Ge+her The Hardest Part Of ... 3:15 2000-09-02 wk1 91.0 2 2000 3 Doors Down Kryptonite 3:53 2000-04-08 wk1 81.0 3 2000 3 Doors Down Loser 4:24 2000-10-21 wk1 76.0 4 2000 504 Boyz Wobble Wobble 3:35 2000-04-15 wk1 57.0
In [17]:ebola=pd.read_csv('data/country_timeseries.csv') print(ebola.columns)
Index(['Date', 'Day', 'Cases_Guinea', 'Cases_Liberia', 'Cases_SierraLeone', 'Cases_Nigeria', 'Cases_Senegal', 'Cases_UnitedStates', 'Cases_Spain', 'Cases_Mali', 'Deaths_Guinea', 'Deaths_Liberia', 'Deaths_SierraLeone', 'Deaths_Nigeria', 'Deaths_Senegal', 'Deaths_UnitedStates', 'Deaths_Spain', 'Deaths_Mali'], dtype='object')
In [18]:print(ebola.iloc[:5,[0,1,2,3,10,11]])
Date Day Cases_Guinea Cases_Liberia Deaths_Guinea Deaths_Liberia 0 1/5/2015 289 2776.0 NaN 1786.0 NaN 1 1/4/2015 288 2775.0 NaN 1781.0 NaN 2 1/3/2015 287 2769.0 8166.0 1767.0 3496.0 3 1/2/2015 286 NaN 8157.0 NaN 3496.0 4 12/31/2014 284 2730.0 8115.0 1739.0 3471.0
2.¶
일단 Data와 Day를 고정하고 나머지를 행으로 피벗하겠습니다. 그러면 각 나라별 사망자 수를 행으로 볼 수 있어 편리합니다. 열 이름을 분리하는 것은 바로 다음 실습에서 진행합니다.
In [19]:ebola_long=pd.melt(ebola, id_vars=['Date', 'Day']) print(ebola_long.head())
Date Day variable value 0 1/5/2015 289 Cases_Guinea 2776.0 1 1/4/2015 288 Cases_Guinea 2775.0 2 1/3/2015 287 Cases_Guinea 2769.0 3 1/2/2015 286 Cases_Guinea NaN 4 12/31/2014 284 Cases_Guinea 2730.0
split 메서드로 열 이름 분리하기¶
CasesGuinea와 같이 2개 이상의 의미를 가지고 있는 열 이름은 밑줄()을 기준으로 Cases, Guinea와 같은 방법으로 분리할 수 있습니다. 이때 열 이름을 분리하려면 split 메서드를 사용하면 됩니다. split 메서드는 기본적으로 공백을 기준으로 문자열을 자릅니다. 그러면 다음 실습을 통해 Cases_Guinea와 같은 열 이름을 분리하는 방법에 대해 알아보겠습니다.
In [20]:variable_split=ebola_long.variable.str.split('_') print(variable_split[:5])
0 [Cases, Guinea] 1 [Cases, Guinea] 2 [Cases, Guinea] 3 [Cases, Guinea] 4 [Cases, Guinea] Name: variable, dtype: object
2.¶
이때 variable_split에 저장된 값의 자료형은 시리즈이고 각각의 시리즈에 저장된 값의 자료형은 리스트입니다.
In [21]:print(type(variable_split))
<class 'pandas.core.series.Series'>
In [22]:print(type(variable_split[0]))
<class 'list'>
3.¶
이때 과정 1에서 구한 리스트의 0번째 인덱스에 담긴 문자열은 발병과 죽음 같은 상태를 의미하고 1번째 인덱스에 담긴 문자열은 나라 이름을 의미합니다. 이제 이 문자열을 분리하여 데이터프레임의 새로운 열로 추가하면 되겠죠? 다음은 get 메서드를 사용하여 0,1번째 인덱스의 데이터를 한 번에 추출한 것입니다.
In [24]:status_values=variable_split.str.get(0) country_values=variable_split.str.get(1) print(status_values[:5])
0 Cases 1 Cases 2 Cases 3 Cases 4 Cases Name: variable, dtype: object
In [25]:print(status_values[-5:])
1947 Deaths 1948 Deaths 1949 Deaths 1950 Deaths 1951 Deaths Name: variable, dtype: object
In [26]:print(country_values[:5])
0 Guinea 1 Guinea 2 Guinea 3 Guinea 4 Guinea Name: variable, dtype: object
In [27]:print(country_values[-5:])
1947 Mali 1948 Mali 1949 Mali 1950 Mali 1951 Mali Name: variable, dtype: object
4.¶
다음은 과정 3에서 분리한 문자열을 status, country라는 열 이름으로 데이터프레임에 추가한 코드입니다.
In [28]:ebola_long['status']=status_values ebola_long['country']=country_values print(ebola_long.head())
Date Day variable value status country 0 1/5/2015 289 Cases_Guinea 2776.0 Cases Guinea 1 1/4/2015 288 Cases_Guinea 2775.0 Cases Guinea 2 1/3/2015 287 Cases_Guinea 2769.0 Cases Guinea 3 1/2/2015 286 Cases_Guinea NaN Cases Guinea 4 12/31/2014 284 Cases_Guinea 2730.0 Cases Guinea
concat 메서드로 데이터프레임에 열 추가하기¶
concat 메서드를 활용하면 split 메서드로 분리한 데이터를 바로 데이터프레임에 추가할 수도 있습니다. 다음은 바로 앞에서 실습한 내용을 concat 메서드로 바꿔 실행한 코드입니다.
In [29]:variable_split=ebola_long.variable.str.split('_',expand=True) variable_split.columns=['status', 'country'] ebola_parsed=pd.concat([ebola_long, variable_split], axis=1) print(ebola_parsed.head())
Date Day variable value status country status country 0 1/5/2015 289 Cases_Guinea 2776.0 Cases Guinea Cases Guinea 1 1/4/2015 288 Cases_Guinea 2775.0 Cases Guinea Cases Guinea 2 1/3/2015 287 Cases_Guinea 2769.0 Cases Guinea Cases Guinea 3 1/2/2015 286 Cases_Guinea NaN Cases Guinea Cases Guinea 4 12/31/2014 284 Cases_Guinea 2730.0 Cases Guinea Cases Guinea
07-3 여러 열을 하나로 정리하기¶
보통 데이터프레임의 열은 파이썬의 변수와 같은 개념으로 사용합니다. 하지만 비슷한 성질의 데이터를 관리하기 위해 열이 여러 개로 분리되어 있는 경우도 있습니다. 다음 실습을 통해 여러 개로 분리된 열을 정리하는 방법에 대해 알아보겠습니다.
In [32]:weather=pd.read_csv('data/weather.csv') print(weather.iloc[:5,:])
id year month element d1 d2 d3 d4 d5 d6 ... d22 d23 \ 0 MX17004 2010 1 tmax NaN NaN NaN NaN NaN NaN ... NaN NaN 1 MX17004 2010 1 tmin NaN NaN NaN NaN NaN NaN ... NaN NaN 2 MX17004 2010 2 tmax NaN 27.3 24.1 NaN NaN NaN ... NaN 29.9 3 MX17004 2010 2 tmin NaN 14.4 14.4 NaN NaN NaN ... NaN 10.7 4 MX17004 2010 3 tmax NaN NaN NaN NaN 32.1 NaN ... NaN NaN d24 d25 d26 d27 d28 d29 d30 d31 0 NaN NaN NaN NaN NaN NaN 27.8 NaN 1 NaN NaN NaN NaN NaN NaN 14.5 NaN 2 NaN NaN NaN NaN NaN NaN NaN NaN 3 NaN NaN NaN NaN NaN NaN NaN NaN 4 NaN NaN NaN NaN NaN NaN NaN NaN [5 rows x 35 columns]
2.¶
다음은 melt 메서드로 일별 온도 측정값을 피벗한 것입니다. 그러면 day열에 날짜 열이 정리되고 날짜 열의 데이터는 temp 열에 정리됩니다. 하지만 아직 최고, 최저온도가 한눈에 잘 들어오지 않습니다.
In [33]:weather_melt=pd.melt(weather, id_vars=['id', 'year', 'month', 'element'], var_name='day', value_name='temp') print(weather_melt.head())
id year month element day temp 0 MX17004 2010 1 tmax d1 NaN 1 MX17004 2010 1 tmin d1 NaN 2 MX17004 2010 2 tmax d1 NaN 3 MX17004 2010 2 tmin d1 NaN 4 MX17004 2010 3 tmax d1 NaN
3.¶
이제 pivot_table 메서드를 사용할 차례입니다. pivot_table 메서드는 행과 열의 위치를 다시 바꿔 정리해 줍니다. index 인자에는 위치를 그대로 유지할 열 이름을 지정하고, columns 인자에는 피벗할 열 이름을 지정하고, values 인자에는 새로운 열의 데이터가 될 열 이름을 지정하면 됩니다. 다음은 pivot_table 메서드로 행과 열의 위치를 다시 바꾼 것입니다. 과정 2의 실행 결과와 비교하여 살펴보세요.
In [35]:weather_tidy=weather_melt.pivot_table( index=['id', 'year', 'month', 'day'], columns='element', values='temp', dropna=False ) print(weather_tidy)
element tmax tmin id year month day MX17004 2010 1 d1 NaN NaN d10 NaN NaN d11 NaN NaN d12 NaN NaN d13 NaN NaN ... ... ... 12 d5 NaN NaN d6 27.8 10.5 d7 NaN NaN d8 NaN NaN d9 NaN NaN [341 rows x 2 columns]
4.¶
다음은 과정 3에서 구한 데이터프레임의 인덱스를 reset_index 메서드로 새로 지정한 것입니다.
In [36]:weather_tidy_flat=weather_tidy.reset_index() print(weather_tidy_flat.head())
element id year month day tmax tmin 0 MX17004 2010 1 d1 NaN NaN 1 MX17004 2010 1 d10 NaN NaN 2 MX17004 2010 1 d11 NaN NaN 3 MX17004 2010 1 d12 NaN NaN 4 MX17004 2010 1 d13 NaN NaN
07-4 중복 데이터 처리하기¶
이번에 다룰 빌보드 차트 데이터는 artist, track, time, date.entered 열의 데이터가 반복됩니다. 이런 반복되는 데이터는 따로 관리하는 것이 좋습니다. 왜 따로 관리하는 것이 좋을까요? 그리고 따로 관리하려면 어떻게 해야 할까요? 다음 실습을 통해 중복 데이터를 처리하는 방법에 대해 알아보겠습니다.
In [39]:billboard=pd.read_csv('data/billboard.csv') billboard_long=pd.melt(billboard, id_vars=['year', 'artist', 'track', 'time', 'date.entered'], var_name='week', value_name='rating') print(billboard_long.shape)
(24092, 7)
In [40]:print(billboard_long.head())
year artist track time date.entered week rating 0 2000 2 Pac Baby Don't Cry (Keep... 4:22 2000-02-26 wk1 87.0 1 2000 2Ge+her The Hardest Part Of ... 3:15 2000-09-02 wk1 91.0 2 2000 3 Doors Down Kryptonite 3:53 2000-04-08 wk1 81.0 3 2000 3 Doors Down Loser 4:24 2000-10-21 wk1 76.0 4 2000 504 Boyz Wobble Wobble 3:35 2000-04-15 wk1 57.0
2.¶
노래 제목이 Loser인 데이터만 따로 모아 살펴보면 중복 데이터가 꽤 많다는 것을 알 수 있습니다. 예를 들어 가수는 고유한 값이기 때문에 따로 관리하는 것이 데이터의 일관성을 유지하는 데 더 도움이 됩니다.
In [41]:print(billboard_long[billboard_long.track=='Loser'].head())
year artist track time date.entered week rating 3 2000 3 Doors Down Loser 4:24 2000-10-21 wk1 76.0 320 2000 3 Doors Down Loser 4:24 2000-10-21 wk2 76.0 637 2000 3 Doors Down Loser 4:24 2000-10-21 wk3 72.0 954 2000 3 Doors Down Loser 4:24 2000-10-21 wk4 69.0 1271 2000 3 Doors Down Loser 4:24 2000-10-21 wk5 67.0
3.¶
중복 데이터를 가지고 있는 열은 year, artist, track, time, date 입니다. 이 열을 따로 모아 새로운 데이터프레임에 저장합니다.
In [42]:billboard_songs=billboard_long[['year', 'artist', 'track', 'time']] print(billboard_songs.shape)
(24092, 4)
4.¶
그런다음 drop_duplicates 메서드로 데이터프레임의 중복 데이터를 제거합니다.
In [44]:billboard_songs=billboard_songs.drop_duplicates() print(billboard_songs.shape)
(317, 4)
5.¶
중복을 제거한 데이터프레임에 다음과 같이 아이디도 추가합니다.
In [45]:billboard_songs['id']=range(len(billboard_songs)) print(billboard_songs.head(n=10))
year artist track time id 0 2000 2 Pac Baby Don't Cry (Keep... 4:22 0 1 2000 2Ge+her The Hardest Part Of ... 3:15 1 2 2000 3 Doors Down Kryptonite 3:53 2 3 2000 3 Doors Down Loser 4:24 3 4 2000 504 Boyz Wobble Wobble 3:35 4 5 2000 98^0 Give Me Just One Nig... 3:24 5 6 2000 A*Teens Dancing Queen 3:44 6 7 2000 Aaliyah I Don't Wanna 4:15 7 8 2000 Aaliyah Try Again 4:03 8 9 2000 Adams, Yolanda Open My Heart 5:30 9
6.¶
다음은 merge 메서드를 사용해 노래 정보와 주간 순위 데이터를 합친 것입니다.
In [47]:billboard_ratings=billboard_long.merge(billboard_songs, on=['year', 'artist', 'track', 'time']) print(billboard_ratings.shape)
(24092, 8)
In [48]:print(billboard_ratings.head())
year artist track time date.entered week rating id 0 2000 2 Pac Baby Don't Cry (Keep... 4:22 2000-02-26 wk1 87.0 0 1 2000 2 Pac Baby Don't Cry (Keep... 4:22 2000-02-26 wk2 82.0 0 2 2000 2 Pac Baby Don't Cry (Keep... 4:22 2000-02-26 wk3 72.0 0 3 2000 2 Pac Baby Don't Cry (Keep... 4:22 2000-02-26 wk4 77.0 0 4 2000 2 Pac Baby Don't Cry (Keep... 4:22 2000-02-26 wk5 87.0 0
07-5 대용량 데이터 처리하기¶
여러 개로 나누어진 데이터 불러오기¶
데이터는 필요에 따라 나누어 저장하기도 합니다. 데이터를 나누어 저장하면 용량이 작아져 데이터를 저장하거나 다른 사람에게 공유할 때 유용하죠. 또 어떤 경우에는 처음부터 크기가 작은 데이터가 생성되는 경우도 있습니다. 예를 들어 주식 정보를 매일 수집한다면 일 단위로 데이터가 생성됩니다. 지금까지는 한 덩어리의 데이터를 불러와 여러 가지 실습을 진행했습니다. 그러면 여러 개로 나누어진 데이터를 신속하게 불러오려면 어떻게 해야할까요? 그리고 이런 데이터를 다루는 방법은 무엇일까요?
뉴욕 택시 데이터 준비하기¶
뉴욕 택시 데이터는 13억 대의 뉴욕 택시에 대한 정보를 가지고 있습니다. 파일의 개수도 140개나 됩니다. 이번 실습에서는 이 중 5개의 데이터만 사용해 보겠습니다.
1.¶
다음을 입력하여 실행한 후 데이터를 내려받습니다. 네트워크 상태에 따라 5~15분이 소요 됩니다.
In [51]:import os import urllib.request with open('data/raw_data_urls.txt', 'r') as data_urls: for line, url in enumerate(data_urls): if line == 5: break fn=url.split('/')[-1].strip() fp=os.path.join('','data',fn) print(url) print(fp) urllib.request.urlretrieve(url, fp)
https://s3.amazonaws.com/nyc-tlc/trip+data/fhv_tripdata_2015-01.csv data/fhv_tripdata_2015-01.csv https://s3.amazonaws.com/nyc-tlc/trip+data/fhv_tripdata_2015-02.csv data/fhv_tripdata_2015-02.csv https://s3.amazonaws.com/nyc-tlc/trip+data/fhv_tripdata_2015-03.csv data/fhv_tripdata_2015-03.csv https://s3.amazonaws.com/nyc-tlc/trip+data/fhv_tripdata_2015-04.csv data/fhv_tripdata_2015-04.csv https://s3.amazonaws.com/nyc-tlc/trip+data/fhv_tripdata_2015-05.csv data/fhv_tripdata_2015-05.csv
2.¶
내려받은 데이터는 data 폴더에 'fhv_rtipdata_YYYY_MM_csv'라는 이름으로 저장됩니다. 이제 판다스로 데이터를 불러오면 됩니다. glob 라이브러리에 포함된 glob 메서드는 특정한 패턴의 이름을 가진 파일을 한 번에 읽어 들일 수 있습니다. glob 메서드로 5개의 파일을 불러옵니다.
In [54]:import glob nyc_taxi_data=glob.glob('data/fhv_*') print(nyc_taxi_data)
['data/fhv_tripdata_2015-01.csv', 'data/fhv_tripdata_2015-02.csv', 'data/fhv_tripdata_2015-03.csv', 'data/fhv_tripdata_2015-04.csv', 'data/fhv_tripdata_2015-05.csv']
3.¶
그런 다음 각각의 파일을 데이터프레임으로 저장합니다.
In [55]:taxi1=pd.read_csv(nyc_taxi_data[0]) taxi2=pd.read_csv(nyc_taxi_data[1]) taxi3=pd.read_csv(nyc_taxi_data[2]) taxi4=pd.read_csv(nyc_taxi_data[3]) taxi5=pd.read_csv(nyc_taxi_data[4])
4.¶
데이터를 잘 불러왔는지 확인합니다.
In [56]:print(taxi1.head(n=2)) print(taxi2.head(n=2)) print(taxi3.head(n=2)) print(taxi4.head(n=2)) print(taxi5.head(n=2))
Dispatching_base_num Pickup_date locationID 0 B00013 2015-01-01 00:30:00 NaN 1 B00013 2015-01-01 01:22:00 NaN Dispatching_base_num Pickup_date locationID 0 B00013 2015-02-01 00:00:00 NaN 1 B00013 2015-02-01 00:01:00 NaN Dispatching_base_num Pickup_date locationID 0 B00029 2015-03-01 00:02:00 213.0 1 B00029 2015-03-01 00:03:00 51.0 Dispatching_base_num Pickup_date locationID 0 B00001 2015-04-01 04:30:00 NaN 1 B00001 2015-04-01 06:00:00 NaN Dispatching_base_num Pickup_date locationID 0 B00001 2015-05-01 04:30:00 NaN 1 B00001 2015-05-01 05:00:00 NaN
5.¶
각 데이터의 구조, 즉 행과 열을 확인해 보겠습니다. 데이터가 꽤 크다는 것을 알 수 있습니다.
In [57]:print(taxi1.shape) print(taxi2.shape) print(taxi3.shape) print(taxi4.shape) print(taxi5.shape)
(2746033, 3) (3126401, 3) (3281427, 3) (3917789, 3) (4296067, 3)
6.¶
이제 데이터 처리를 위해 각 데이터프레임을 연결해야 합니다. 다음은 concat메서드로 모든 데이터프레임을 연결한 것입니다.
In [58]:taxi=pd.concat([taxi1,taxi2,taxi3,taxi4,taxi5]) print(taxi.shape)
(17367717, 3)
반복문으로 데이터 준비하기¶
반복문을 응용하면 단 몇 줄의 코드로 데이터를 준비할 수 있습니다. 앞의 실습에서 생성한 파일 목록을 반복문으로 읽어 들인 다음 리스트에 이어붙이면 됩니다. 그러면 리스트에 데이터프레임이 순서대로 저장됩니다.
In [59]:list_taxi_df=[] for csv_filename in nyc_taxi_data: #print(csv_filename) df=pd.read_csv(csv_filename) list_taxi_df.append(df) print(len(list_taxi_df))
5
In [60]:print(type(list_taxi_df[0]))
<class 'pandas.core.frame.DataFrame'>
In [61]:print(list_taxi_df[0].head())
Dispatching_base_num Pickup_date locationID 0 B00013 2015-01-01 00:30:00 NaN 1 B00013 2015-01-01 01:22:00 NaN 2 B00013 2015-01-01 01:23:00 NaN 3 B00013 2015-01-01 01:44:00 NaN 4 B00013 2015-01-01 02:00:00 NaN
In [62]:taxi_loop_concat=pd.concat(list_taxi_df) print(taxi_loop_concat.shape)
(17367717, 3)
In [64]:print(taxi.equals(taxi_loop_concat))
True
마무리하며¶
이 장에서는 깔끔한 데이터를 만드는 방법에 대해 알아보았습니다. 넓은 데이터를 분석하기 좋은 형태로 만들기 위한 피벗부터 중복 데이터를 처리하는 방법과 여러 열을 하나로 합치는 실습까지 진행해 보았습니다. 데이터 분석에서 깔끔한 데이터는 매우 중요합니다. 반드시 07장에서 공부한 내용을 완벽하게 이해하고 다음 장으로 넘어가세요.
출처 : "do it 데이터 분석을 위한 판다스 입문"
'판다스' 카테고리의 다른 글
chapter-9 문자열 처리하기 (0) 2021.09.23 chapter-8 판다스 자료형 (0) 2021.09.23 chapter-6 누락값 처리하기 (0) 2021.09.23 chapter-03 판다스 데이터프레임과 시리즈 (0) 2021.09.17 chapter-5 데이터 연결하기 (0) 2021.09.17