Tidy Data

Thsis notebbok is designed to explore Hadley Wickman article about tidy data using pandas
The datasets are available on github : https://github.com/hadley/tidy-data/blob/master/data/

Import Packages


In [28]:
import pandas as pd
import numpy as np

In [29]:
# tuberculosis (TB) dataset
path_tb = '/Users/ericfourrier/Documents/ProjetR/tidy-data/data/tb.csv'
df_tb = pd.read_csv(path_tb)

In [30]:
df_tb.head(20)


Out[30]:
iso2 year new_sp new_sp_m04 new_sp_m514 new_sp_m014 new_sp_m1524 new_sp_m2534 new_sp_m3544 new_sp_m4554 ... new_sp_f04 new_sp_f514 new_sp_f014 new_sp_f1524 new_sp_f2534 new_sp_f3544 new_sp_f4554 new_sp_f5564 new_sp_f65 new_sp_fu
0 AD 1989 NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1 AD 1990 NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2 AD 1991 NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
3 AD 1992 NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
4 AD 1993 15 NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
5 AD 1994 24 NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
6 AD 1996 8 NaN NaN 0 0 0 4 1 ... NaN NaN 0 1 1 0 0 1 0 NaN
7 AD 1997 17 NaN NaN 0 0 1 2 2 ... NaN NaN 0 1 2 3 0 0 1 NaN
8 AD 1998 1 NaN NaN 0 0 0 1 0 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9 AD 1999 4 NaN NaN 0 0 0 1 1 ... NaN NaN 0 0 0 1 0 0 0 NaN
10 AD 2000 1 NaN NaN 0 0 1 0 0 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
11 AD 2001 3 NaN NaN 0 NaN NaN 2 1 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
12 AD 2002 2 NaN NaN 0 0 0 1 0 ... NaN NaN 0 1 0 0 0 0 0 NaN
13 AD 2003 7 NaN NaN 0 0 0 1 2 ... NaN NaN 0 1 1 1 0 0 0 NaN
14 AD 2004 3 NaN NaN 0 0 0 1 1 ... NaN NaN 0 0 1 0 0 0 0 NaN
15 AD 2005 5 0 0 0 0 1 1 0 ... 0 0 0 1 1 1 0 0 0 0
16 AD 2006 8 0 0 0 1 1 2 0 ... 0 0 0 0 1 0 1 0 0 0
17 AD 2007 2 NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN 1 NaN 1 NaN NaN NaN
18 AD 2008 3 0 0 0 0 0 0 1 ... 0 0 0 0 0 1 1 0 0 0
19 AE 1980 NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN

20 rows × 23 columns

Original TB dataset. Corresponding to each ‘m’ column for males, there is also an ‘f’ column for females, f1524, f2534 and so on. These are not shown to conserve space. Note the mixture of 0s and missing values. This is due to the data collection process and the distinction is important for this dataset.


In [31]:
# clean column names 
df_tb = df_tb.rename(columns={'iso2':'country'}) # rename iso2 in country
df_tb = df_tb.drop(['new_sp'],axis = 1)
df_tb.columns = [c.replace('new_sp_','') for c in df_tb.columns] # remove new_sp_
df_tb.head()


Out[31]:
country year m04 m514 m014 m1524 m2534 m3544 m4554 m5564 ... f04 f514 f014 f1524 f2534 f3544 f4554 f5564 f65 fu
0 AD 1989 NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1 AD 1990 NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2 AD 1991 NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
3 AD 1992 NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
4 AD 1993 NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN

5 rows × 22 columns


In [32]:
df_tb_wide = pd.melt(df_tb,id_vars = ['country','year'])

In [33]:
df_tb_wide = df_tb_wide.rename(columns={'variable':'column','value':'cases'})
df_tb_wide


Out[33]:
country year column cases
0 AD 1989 m04 NaN
1 AD 1990 m04 NaN
2 AD 1991 m04 NaN
3 AD 1992 m04 NaN
4 AD 1993 m04 NaN
5 AD 1994 m04 NaN
6 AD 1996 m04 NaN
7 AD 1997 m04 NaN
8 AD 1998 m04 NaN
9 AD 1999 m04 NaN
10 AD 2000 m04 NaN
11 AD 2001 m04 NaN
12 AD 2002 m04 NaN
13 AD 2003 m04 NaN
14 AD 2004 m04 NaN
15 AD 2005 m04 0
16 AD 2006 m04 0
17 AD 2007 m04 NaN
18 AD 2008 m04 0
19 AE 1980 m04 NaN
20 AE 1981 m04 NaN
21 AE 1982 m04 NaN
22 AE 1983 m04 NaN
23 AE 1984 m04 NaN
24 AE 1985 m04 NaN
25 AE 1986 m04 NaN
26 AE 1987 m04 NaN
27 AE 1988 m04 NaN
28 AE 1989 m04 NaN
29 AE 1990 m04 NaN
... ... ... ... ...
115350 ZM 2008 fu 0
115351 ZW 1980 fu NaN
115352 ZW 1981 fu NaN
115353 ZW 1982 fu NaN
115354 ZW 1983 fu NaN
115355 ZW 1984 fu NaN
115356 ZW 1985 fu NaN
115357 ZW 1986 fu NaN
115358 ZW 1987 fu NaN
115359 ZW 1988 fu NaN
115360 ZW 1989 fu NaN
115361 ZW 1990 fu NaN
115362 ZW 1991 fu NaN
115363 ZW 1992 fu NaN
115364 ZW 1993 fu NaN
115365 ZW 1994 fu NaN
115366 ZW 1995 fu NaN
115367 ZW 1996 fu NaN
115368 ZW 1997 fu NaN
115369 ZW 1998 fu NaN
115370 ZW 1999 fu NaN
115371 ZW 2000 fu NaN
115372 ZW 2001 fu NaN
115373 ZW 2002 fu NaN
115374 ZW 2003 fu NaN
115375 ZW 2004 fu NaN
115376 ZW 2005 fu NaN
115377 ZW 2006 fu NaN
115378 ZW 2007 fu NaN
115379 ZW 2008 fu 0

115380 rows × 4 columns

Create sex and age columns from variable 'column'


In [34]:
# create sex:

ages = {"04" : "0-4", "514" : "5-14", "014" : "0-14",
        "1524" : "15-24","2534" : "25-34", "3544" : "35-44",
        "4554" : "45-54", "5564" : "55-64", "65": "65+", "u" : np.nan}

In [35]:
# Create genre and age from the mixed type column
df_tb_wide['age']=df_tb_wide['column'].str[1:]
df_tb_wide['genre']=df_tb_wide['column'].str[0]
df_tb_wide = df_tb_wide.drop('column', axis=1)

In [36]:
# change category 
df_tb_wide['age'] = df_tb_wide['age'].map(lambda x: ages[x])

In [37]:
# clean dataset 
df_tb_wide


Out[37]:
country year cases age genre
0 AD 1989 NaN 0-4 m
1 AD 1990 NaN 0-4 m
2 AD 1991 NaN 0-4 m
3 AD 1992 NaN 0-4 m
4 AD 1993 NaN 0-4 m
5 AD 1994 NaN 0-4 m
6 AD 1996 NaN 0-4 m
7 AD 1997 NaN 0-4 m
8 AD 1998 NaN 0-4 m
9 AD 1999 NaN 0-4 m
10 AD 2000 NaN 0-4 m
11 AD 2001 NaN 0-4 m
12 AD 2002 NaN 0-4 m
13 AD 2003 NaN 0-4 m
14 AD 2004 NaN 0-4 m
15 AD 2005 0 0-4 m
16 AD 2006 0 0-4 m
17 AD 2007 NaN 0-4 m
18 AD 2008 0 0-4 m
19 AE 1980 NaN 0-4 m
20 AE 1981 NaN 0-4 m
21 AE 1982 NaN 0-4 m
22 AE 1983 NaN 0-4 m
23 AE 1984 NaN 0-4 m
24 AE 1985 NaN 0-4 m
25 AE 1986 NaN 0-4 m
26 AE 1987 NaN 0-4 m
27 AE 1988 NaN 0-4 m
28 AE 1989 NaN 0-4 m
29 AE 1990 NaN 0-4 m
... ... ... ... ... ...
115350 ZM 2008 0 NaN f
115351 ZW 1980 NaN NaN f
115352 ZW 1981 NaN NaN f
115353 ZW 1982 NaN NaN f
115354 ZW 1983 NaN NaN f
115355 ZW 1984 NaN NaN f
115356 ZW 1985 NaN NaN f
115357 ZW 1986 NaN NaN f
115358 ZW 1987 NaN NaN f
115359 ZW 1988 NaN NaN f
115360 ZW 1989 NaN NaN f
115361 ZW 1990 NaN NaN f
115362 ZW 1991 NaN NaN f
115363 ZW 1992 NaN NaN f
115364 ZW 1993 NaN NaN f
115365 ZW 1994 NaN NaN f
115366 ZW 1995 NaN NaN f
115367 ZW 1996 NaN NaN f
115368 ZW 1997 NaN NaN f
115369 ZW 1998 NaN NaN f
115370 ZW 1999 NaN NaN f
115371 ZW 2000 NaN NaN f
115372 ZW 2001 NaN NaN f
115373 ZW 2002 NaN NaN f
115374 ZW 2003 NaN NaN f
115375 ZW 2004 NaN NaN f
115376 ZW 2005 NaN NaN f
115377 ZW 2006 NaN NaN f
115378 ZW 2007 NaN NaN f
115379 ZW 2008 0 NaN f

115380 rows × 5 columns


In [ ]: