티스토리 뷰

#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

 

 

출처 : 데이터 분석을 위한 판다스 입문

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함