티스토리 뷰
#12 판다스 chapter 12. 깔끔한 데이터 만들기
깔끔한 데이터
열과 피벗
- 넓은 데이터
데이터프레임의 열은 파이썬의 변수와 비슷한 역할을 한다. 예를들어 ebola 데이터 프레임 열은 사망한 날짜, 발병 국가 등의 데이터를 저장하고 있다. 하지만 이번에 다루는 데이터프레임의 열은 열 자체가 어떤 값을 의미한다. 그러다 보니 데이터프레임의 열이 옆으로 길게 늘어선 형태가 된다. 바로 이것을 넓은 데이터라고 한다. 밑에서 자주 사용할 melt 메서드에 대해 알아보자.
- melt 메서드
판다스는 데이터프레임을 깔끔한 데이터로 정리하는 데 유용한 melt 메서드를 제공한다.
다음은 metl 메서드를 실습할 때 사용할 인자를 정리한 것이다.
- melt 메서드 인자
- id_vars - 위치를 그대로 유지할 열의 이름을 지정합니다.
- value_vars - 행으로 위치를 변경할 열의 이름을 지정합니다.
- var_name - value_vars로 위치를 변경한 열의 이름을 지정합니다.
- value_name - var_name으로 위치를 변경한 열의 데이터를 저장한 열의 이름을 지정합니다.
-melt 메서드 사용하기
1) 1개의 열만 고정하고 나머지 열을 행으로 바꾸기
이번에 사용할 데이터 집합은 퓨 리서치 센터에서 조사한 '미국의 소득과 종교' 라는 데이터입니다. 이 데이터프레임은 총 11개의 열이 있다.
import pandas as pd
pew = pd.read_csv('C:/users\이재윤/downloads/doit_pandas-master/doit_pandas-master/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개의 열만 출력해 보자. 그러면 종교와 소득 정보가 출력됩니다. 하지만 이 상태는 소득 정보가 열을 구성하고 있다. 만약 소득 정보 열을 행 데이터로 옮기고 싶다면 어떻게 해야 할까?
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 인잣값으로 지정한 열(religion)을 제외한 나머지 소득 정보 열이 variable 열로 정리되고 소득 정보 열의 행 데이터도 value 열로 정리되었다.바로 이 과정을 'religion열을 고정하여 피벗했다' 라고 말한다.
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 인잣값을 사용하면 된다. 다음을 따라해 보자.
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개 이상의 열을 고정하고 나머지 열을 행으로 바꾸면 어떻게 될까? 다음을 실습해 보며 빌보다 차트 데이터프레임이 어떻게 구성되어 있는지 확인해 보자.
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 열을 모두 고정하고 나머지 열을 피벗한 것이다.
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
열 이름 관리하기
- 하나의 열이 여러 의미를 가지고 있는 경우
어떤 열은 여러가지 의미를 가지고 있을 수 있다. 예를 들어 ebola 데이터 집합의 열 중 하나인 Deaths_Guina는 '사망자 수'와 '나라 이름'을 합쳐 만든 이름이다. 그러면 ebola 데이터 집합을 살펴보면서 하나의 열이 여러 가지 의미를 가지고 있다는 것이 무엇인지 구체적으로 알아보자.
- ebola 데이터 집합 살펴보기
1) 다음은 ebola 데이터를 불러온 다음 0,1,2,3,10,11열의 5개 데이터만 확인한 것입니다.
ebola = pd.read_csv('C:/users\이재윤/downloads/doit_pandas-master/doit_pandas-master/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')
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) 일단 Date와 Day를 고정하고 나머지를 행으로 피벗하자. 그러면 각 나라별 사망자 수를 행으로 볼 수 있어 편리하다.
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 메서드로 열 이름 분리하기
Cases_Guinea와 같이 2개의 의미를 가지고 있는 열 이름은 밑줄( _ ) 을 기준으로 Cases, Guinea 와 같은 방법으로 분리할 수 있다. 이때 열 이름을 분리하려면 split 메서드를 사용하면 된다. split 메서드는 기본적으로 공백을 기준으로 문자열을 자른다.
-열 이름 분리하고 데이터프레임에 추가하기
1) split 메서드에 ' _ '를 전달하면 Cases_Guinea를 Cases,Guinea로 분리할 수 있다.
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에 저장된 값의 자료형은 시리즈이고 각각의 시리즈에 저장된 값의 자료형은 리스트이다.
print(type(variable_split))
<class 'pandas.core.series.Series'>
print(type(variable_split[0]))
<class 'list'>
3) 과정 1에서 구한 리스트의 0번째 인덱스에 담긴 문자열은 Cases와 Deaths 같은 상태를 의미하고 1번째 인덱스에 담긴 문자열은 나라 이름을 의미한다. 이제 이 문자열을 분리하여 데이터프레임의 새로운 열로 추가해보자. 다음은 get 메서드를 사용하여 0, 1번째 인덱스의 데이터를 한 번에 추출한 것이다.
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
print(status_values[-5:])
1947 Deaths
1948 Deaths
1949 Deaths
1950 Deaths
1951 Deaths
Name: variable, dtype: object
print(country_values[:5])
0 Guinea
1 Guinea
2 Guinea
3 Guinea
4 Guinea
Name: variable, dtype: object
print(country_values[-5:])
1947 Mali
1948 Mali
1949 Mali
1950 Mali
1951 Mali
Name: variable, dtype: object
4) 다음은 과정 3에서 분리한 문자열을 status, country라는 열 이름으로 데이터프레임에 추가한 코드이다.
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 메서드로 분리한 데이터를 바로 데이터프레임에 추가할 수도 있다.
variable_split = ebola_long.variable.str.split('_', expand=True)
variable_split.colums = ['status', 'country']
ebola_parsed = pd.concat([ebola_long, variable_split], axis=1)
print(ebola_parsed.head())
Date Day variable value status country 0 1
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
여러 열을 하나로 정리하기
보통 데이터 프레임의 열은 파이썬의 변수와 같은 개념으로 사용한다. 하지만 비슷한 성질의 데이터를 관리하기 위해 열이 여러개로 분리되어 있는 경우도 있다.
- 기상 데이터의 여러 열을 하나로 정리하기 -- melt, pivot, table 메서드
1) 다음은 기상 데이터를 불러와 출력한 것이다. 날짜 열에는 각 월별로 최고, 최저 온도 데이터가 저장되어 있습니다. 아래를 보면 날짜 열이 옆으로 길게 늘어져 있어 보기 불편하다. 먼저 날짜 열을 행 데이터로 피벗해 보자.
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 열에 정리된다. 하지만 아직 최고, 최저온도가 한눈에 잘 들어오지 않는다.
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 인자에는 새로운 열의 데이터가 될 열 이름을 지정하면 된다.
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 메서드로 새로 지정한 것이다.
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
중복 데이터 처리하기
이번에 다룰 빌보드 차트 데이터는 artist, track, time, date.entered 열의 데이터가 반복된다. 이런 반복되는 데이터는 따로 관리하는게 좋다.
- 빌보드 차트의 중복 데이터 처리하기
1) 다음은 빌보드 차트 데이터를 불러온 것이다.
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)
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인 데이터만 따로 모아 살펴보면 중복데이터가 꽤 많다는 것을 알 수 있다. 예를 들어 가수는 고유한 값이기 때문에 따로 관리하는 것이 데이터의 일관성을 유지하는 데 더 도움이 된다.
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 입니다. 이 열을 따로 모아 새로운 데이터프레임에 저장한다.
billboard_songs = billboard_long[['year', 'artist', 'track', 'time']]
print(billboard_songs.shape)
(24092, 4)
4) 그런 다음 drop_duplicates 메서드로 데이터프레임의 중복 데이터를 제거한다.
billboard_songs = billboard_songs.drop_duplicates()
print(billboard_songs.shape)
(317, 4)
5) 중복을 제거한 데이터프레임에 다음과 같이 아이디도 추가한다.
billboard_songs['id'] = range(len(billboard_songs))
print(billboard_songs.head(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 메서드를 사용해 노래 정보와 주간 순위 데이터를 합친 것이다.
billboard_ratings = billboard_long.merge(billboard_songs, on=['year','artist','track','time'])
print(billboard_ratings.shape)
(24092, 8)
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
대용량 데이터 처리하기
- 여러 개로 나누어진 데이터 불러오기
데이터는 필요에 따라 나누어 저장하기도 합니다. 데이터를 나누어 저장하면 용량이 작아져 데이터를 저장하거나 다른 사람에게 공유할 때 유용하다. 또 어떤 경우에는 처음부터 크기가 작은 데이터가 생성되는 경우도 있다. 예를 들면 주식정보를 매일 수집한다면 일 단위로 데이터가 생성된다. 지금까지는 한 덩어리의 데이터를 불러와 여러 가지 실습을 진행해왔다. 그러면 여러개로 나누어진 데이터를 신속하게 불러오려면 어떻게 해야할까?
-뉴욕 택시 데이터 준비하기
뉴욕 택시 데이터는 13억 대의 뉴욕 택시에 대한 정보를 가지고 있다. 파일의 개수도 140개나 된다. 이 중에서 5개의 데이터만 사용해 보자.
1) 다음을 입력하여 실행한 후 데이터를 내려받자.
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('../pandas_exam_data', fn)
print(url)
print(fp)
urllib.request.urlretrieve(url,fp)
2) 내려받은 데이터는 data 폴더에 'fhv_tripdata_YYYY_MM.csv' 라는 이름으로 저장된다. 이제 판다스로 데이터를 불러오자. glob 라이브러리에 포함된 glob 메서드는 특정한 패턴의 이름을 가진 파일을 한 번에 읽어 들일 수 있다. glob 메서드로 5개의 파일을 불러오자.
import glob
nyc_taxi_data = glob.glob('../pandas_exam_data/fhv_*')
print(nyc_taxi_data)
['../pandas_exam_data\\fhv_tripdata_2015-01.csv',
'../pandas_exam_data\\fhv_tripdata_2015-02.csv',
'../pandas_exam_data\\fhv_tripdata_2015-03.csv',
'../pandas_exam_data\\fhv_tripdata_2015-04.csv',
'../pandas_exam_data\\fhv_tripdata_2015-05.csv']
3) 그런 다음 각각의 파일을 데이터 프레임으로 저장한다.
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) 데이터를 잘 불러왔는지 확인한다.
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) 각 데이터의 구조, 즉 행과 열을 확인해 보자. 데이터가 꽤 크다는 것을 알 수 있다.
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 메서드로 모든 데이터 프레임을 연결한 것이다.
taxi = pd.concat([taxi1, taxi2, taxi3, taxi4, taxi5])
print(taxi.shape)
(17367717, 3)
-알아두면 좋아요
반복문을 응용하면 단 몇줄의 코드로 데이터를 준비할 수 있다. 앞의 실습에서 생성한 파일 목록을 반복문으로 읽어 들인 다음 리스트에 이어붙이면 된다. 그러면 리스트에 데이터프레임이 순서대로 저장된다.
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
print(type(list_taxi_df[0]))
<class 'pandas.core.frame.DataFrame'>
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
taxi_loop_concat = pd.concat(list_taxi_df)
print(taxi_loop_concat.shape)
(17367717, 3)
print(taxi.equals(taxi_loop_concat))
True
출처 : 데이터 분석을 위한 판다스 입문
'판다스 입문' 카테고리의 다른 글
판다스 입문(문자열 처리하기) (0) | 2021.03.22 |
---|---|
판다스 입문(판다스 자료형) (0) | 2021.03.21 |
판다스 입문(누락값 처리하기) (0) | 2021.03.21 |
판다스 입문( 데이터 연결하기) (0) | 2021.03.21 |
판다스 입문(데이터 프레임,시리즈로 그래프 그리기/seaborn 라이브러리로 그래프 스타일 설정하기) (0) | 2021.03.20 |