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/
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
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 [ ]:
Content source: ericfourrier/auto-clean
Similar notebooks: