In [1]:
!head -n 10 babynames/yob1994.txt
In [2]:
import pandas as pd
In [3]:
names1994 = pd.read_csv('babynames/yob1994.txt', names=['name', 'sex', 'births'])
In [4]:
names1994
Out[4]:
name
sex
births
0
Jessica
F
32117
1
Ashley
F
30278
2
Emily
F
24148
3
Samantha
F
22817
4
Sarah
F
22281
5
Taylor
F
20731
6
Brittany
F
18899
7
Amanda
F
18715
8
Elizabeth
F
16778
9
Megan
F
16578
10
Nicole
F
16011
11
Kayla
F
15885
12
Rachel
F
15484
13
Lauren
F
15153
14
Stephanie
F
14749
15
Hannah
F
14494
16
Jennifer
F
13997
17
Alexis
F
13035
18
Victoria
F
12690
19
Danielle
F
12448
20
Amber
F
12345
21
Courtney
F
12019
22
Jasmine
F
11711
23
Rebecca
F
11278
24
Morgan
F
10656
25
Alyssa
F
10602
26
Brianna
F
10517
27
Alexandra
F
10226
28
Kelsey
F
9752
29
Katherine
F
9585
...
...
...
...
25968
Yogi
M
5
25969
Yohanan
M
5
25970
Yomar
M
5
25971
Yordan
M
5
25972
Yordy
M
5
25973
Yoshihiro
M
5
25974
You
M
5
25975
Yutaro
M
5
25976
Yuval
M
5
25977
Yuya
M
5
25978
Yvette
M
5
25979
Zabdiel
M
5
25980
Zacaria
M
5
25981
Zacharay
M
5
25982
Zacherey
M
5
25983
Zackari
M
5
25984
Zacory
M
5
25985
Zahn
M
5
25986
Zakaree
M
5
25987
Zakarie
M
5
25988
Zakhary
M
5
25989
Zakory
M
5
25990
Zaron
M
5
25991
Zaven
M
5
25992
Zavius
M
5
25993
Zedric
M
5
25994
Zef
M
5
25995
Zoey
M
5
25996
Zong
M
5
25997
Zuhair
M
5
25998 rows × 3 columns
In [14]:
years = range(1880, 2015)
In [15]:
pieces = []
In [16]:
columns = ['name', 'sex', 'births']
In [21]:
for year in years:
path = 'babynames/yob%d.txt' % year
frame = pd.read_csv(path, names=columns)
frame['year'] = year
pieces.append(frame)
In [22]:
names = pd.concat(pieces, ignore_index=True)
In [23]:
names
Out[23]:
name
sex
births
year
0
Emma
F
20886
2014
1
Olivia
F
19761
2014
2
Sophia
F
18563
2014
3
Isabella
F
17027
2014
4
Ava
F
15660
2014
5
Mia
F
13484
2014
6
Emily
F
12622
2014
7
Abigail
F
12049
2014
8
Madison
F
10291
2014
9
Charlotte
F
10094
2014
10
Harper
F
9601
2014
11
Sofia
F
9576
2014
12
Avery
F
9552
2014
13
Elizabeth
F
9537
2014
14
Amelia
F
8770
2014
15
Evelyn
F
8734
2014
16
Ella
F
8525
2014
17
Chloe
F
8507
2014
18
Victoria
F
7981
2014
19
Aubrey
F
7616
2014
20
Grace
F
7602
2014
21
Zoey
F
7384
2014
22
Natalie
F
7089
2014
23
Addison
F
6974
2014
24
Lillian
F
6898
2014
25
Brooklyn
F
6791
2014
26
Lily
F
6760
2014
27
Hannah
F
6551
2014
28
Layla
F
6442
2014
29
Scarlett
F
5994
2014
...
...
...
...
...
1858883
Zeid
M
5
2014
1858884
Zeidan
M
5
2014
1858885
Zekeriah
M
5
2014
1858886
Zenas
M
5
2014
1858887
Zephen
M
5
2014
1858888
Zerick
M
5
2014
1858889
Zhaiden
M
5
2014
1858890
Zhalen
M
5
2014
1858891
Zhayden
M
5
2014
1858892
Ziar
M
5
2014
1858893
Zichen
M
5
2014
1858894
Ziden
M
5
2014
1858895
Zierre
M
5
2014
1858896
Ziion
M
5
2014
1858897
Zijun
M
5
2014
1858898
Zilas
M
5
2014
1858899
Zirui
M
5
2014
1858900
Zivon
M
5
2014
1858901
Ziyah
M
5
2014
1858902
Ziyang
M
5
2014
1858903
Zmarion
M
5
2014
1858904
Zo
M
5
2014
1858905
Zoraiz
M
5
2014
1858906
Zyeir
M
5
2014
1858907
Zyel
M
5
2014
1858908
Zykeem
M
5
2014
1858909
Zymeer
M
5
2014
1858910
Zymiere
M
5
2014
1858911
Zyran
M
5
2014
1858912
Zyrin
M
5
2014
1858913 rows × 4 columns
In [25]:
total_births = names.pivot_table('births', index='year', columns='sex', aggfunc=sum)
In [26]:
total_births.tail()
Out[26]:
sex
F
M
year
2010
1773440
1914629
2011
1754424
1894262
2012
1755254
1890889
2013
1747544
1883945
2014
3554484
3821752
In [27]:
def add_prop(group):
births = group.births.astype(float)
group['prop'] = births / births.sum()
return group
In [28]:
names = names.groupby(['year', 'sex']).apply(add_prop)
In [29]:
names
Out[29]:
name
sex
births
year
prop
0
Emma
F
20886
2014
0.005876
1
Olivia
F
19761
2014
0.005559
2
Sophia
F
18563
2014
0.005222
3
Isabella
F
17027
2014
0.004790
4
Ava
F
15660
2014
0.004406
5
Mia
F
13484
2014
0.003794
6
Emily
F
12622
2014
0.003551
7
Abigail
F
12049
2014
0.003390
8
Madison
F
10291
2014
0.002895
9
Charlotte
F
10094
2014
0.002840
10
Harper
F
9601
2014
0.002701
11
Sofia
F
9576
2014
0.002694
12
Avery
F
9552
2014
0.002687
13
Elizabeth
F
9537
2014
0.002683
14
Amelia
F
8770
2014
0.002467
15
Evelyn
F
8734
2014
0.002457
16
Ella
F
8525
2014
0.002398
17
Chloe
F
8507
2014
0.002393
18
Victoria
F
7981
2014
0.002245
19
Aubrey
F
7616
2014
0.002143
20
Grace
F
7602
2014
0.002139
21
Zoey
F
7384
2014
0.002077
22
Natalie
F
7089
2014
0.001994
23
Addison
F
6974
2014
0.001962
24
Lillian
F
6898
2014
0.001941
25
Brooklyn
F
6791
2014
0.001911
26
Lily
F
6760
2014
0.001902
27
Hannah
F
6551
2014
0.001843
28
Layla
F
6442
2014
0.001812
29
Scarlett
F
5994
2014
0.001686
...
...
...
...
...
...
1858883
Zeid
M
5
2014
0.000001
1858884
Zeidan
M
5
2014
0.000001
1858885
Zekeriah
M
5
2014
0.000001
1858886
Zenas
M
5
2014
0.000001
1858887
Zephen
M
5
2014
0.000001
1858888
Zerick
M
5
2014
0.000001
1858889
Zhaiden
M
5
2014
0.000001
1858890
Zhalen
M
5
2014
0.000001
1858891
Zhayden
M
5
2014
0.000001
1858892
Ziar
M
5
2014
0.000001
1858893
Zichen
M
5
2014
0.000001
1858894
Ziden
M
5
2014
0.000001
1858895
Zierre
M
5
2014
0.000001
1858896
Ziion
M
5
2014
0.000001
1858897
Zijun
M
5
2014
0.000001
1858898
Zilas
M
5
2014
0.000001
1858899
Zirui
M
5
2014
0.000001
1858900
Zivon
M
5
2014
0.000001
1858901
Ziyah
M
5
2014
0.000001
1858902
Ziyang
M
5
2014
0.000001
1858903
Zmarion
M
5
2014
0.000001
1858904
Zo
M
5
2014
0.000001
1858905
Zoraiz
M
5
2014
0.000001
1858906
Zyeir
M
5
2014
0.000001
1858907
Zyel
M
5
2014
0.000001
1858908
Zykeem
M
5
2014
0.000001
1858909
Zymeer
M
5
2014
0.000001
1858910
Zymiere
M
5
2014
0.000001
1858911
Zyran
M
5
2014
0.000001
1858912
Zyrin
M
5
2014
0.000001
1858913 rows × 5 columns
In [31]:
import numpy as np
In [32]:
np.allclose(names.groupby(['year', 'sex']).prop.sum(), 1)
Out[32]:
True
In [36]:
def get_top1000(group):
return group.sort_values(by='births', ascending=False)[:1000]
In [37]:
grouped = names.groupby(['year', 'sex'])
In [38]:
top1000 = grouped.apply(get_top1000)
In [39]:
top1000
Out[39]:
name
sex
births
year
prop
year
sex
1880
F
33176
Mary
F
7065
1880
0.077644
33177
Anna
F
2604
1880
0.028618
33178
Emma
F
2003
1880
0.022013
33179
Elizabeth
F
1939
1880
0.021310
33180
Minnie
F
1746
1880
0.019189
33181
Margaret
F
1578
1880
0.017342
33182
Ida
F
1472
1880
0.016177
33183
Alice
F
1414
1880
0.015540
33184
Bertha
F
1320
1880
0.014507
33185
Sarah
F
1288
1880
0.014155
33186
Annie
F
1258
1880
0.013825
33187
Clara
F
1226
1880
0.013474
33188
Ella
F
1156
1880
0.012704
33189
Florence
F
1063
1880
0.011682
33190
Cora
F
1045
1880
0.011485
33191
Martha
F
1040
1880
0.011430
33192
Laura
F
1012
1880
0.011122
33193
Nellie
F
995
1880
0.010935
33194
Grace
F
982
1880
0.010792
33195
Carrie
F
949
1880
0.010429
33196
Maude
F
858
1880
0.009429
33197
Mabel
F
808
1880
0.008880
33198
Bessie
F
796
1880
0.008748
33199
Jennie
F
793
1880
0.008715
33200
Gertrude
F
787
1880
0.008649
33201
Julia
F
783
1880
0.008605
33202
Hattie
F
769
1880
0.008451
33203
Edith
F
768
1880
0.008440
33204
Mattie
F
704
1880
0.007737
33205
Rose
F
700
1880
0.007693
...
...
...
...
...
...
...
...
2014
M
19635
Lawson
M
576
2014
0.000151
1845372
Lawson
M
576
2014
0.000151
19636
Rodrigo
M
575
2014
0.000150
1845373
Rodrigo
M
575
2014
0.000150
19638
Harvey
M
574
2014
0.000150
19637
Beckham
M
574
2014
0.000150
1845374
Beckham
M
574
2014
0.000150
1845375
Harvey
M
574
2014
0.000150
19639
Dennis
M
573
2014
0.000150
1845376
Dennis
M
573
2014
0.000150
19640
Uriel
M
573
2014
0.000150
1845377
Uriel
M
573
2014
0.000150
1845378
Armani
M
570
2014
0.000149
19641
Armani
M
570
2014
0.000149
1845379
Marvin
M
568
2014
0.000149
19642
Marvin
M
568
2014
0.000149
1845380
Frederick
M
566
2014
0.000148
19643
Frederick
M
566
2014
0.000148
1845381
Kian
M
566
2014
0.000148
19644
Kian
M
566
2014
0.000148
19645
Darren
M
565
2014
0.000148
19646
Mohammed
M
565
2014
0.000148
19647
Raylan
M
565
2014
0.000148
1845384
Raylan
M
565
2014
0.000148
1845382
Darren
M
565
2014
0.000148
1845383
Mohammed
M
565
2014
0.000148
1845385
Trent
M
563
2014
0.000147
19648
Trent
M
563
2014
0.000147
19649
Callen
M
561
2014
0.000147
1845386
Callen
M
561
2014
0.000147
269877 rows × 5 columns
In [40]:
boys = top1000[top1000.sex == 'M']
In [41]:
girls = top1000[top1000.sex == 'F']
In [42]:
total_births = top1000.pivot_table('births', index='year', columns='name', aggfunc=sum)
In [43]:
total_births
Out[43]:
name
Aaden
Aaliyah
Aarav
Aaron
Aarush
Ab
Abagail
Abb
Abbey
Abbie
...
Zoa
Zoe
Zoey
Zoie
Zola
Zollie
Zona
Zora
Zula
Zuri
year
1880
NaN
NaN
NaN
102.0
NaN
NaN
NaN
NaN
NaN
71.0
...
8.0
23.0
NaN
NaN
7.0
NaN
8.0
28.0
27.0
NaN
1881
NaN
NaN
NaN
94.0
NaN
NaN
NaN
NaN
NaN
81.0
...
NaN
22.0
NaN
NaN
10.0
NaN
9.0
21.0
27.0
NaN
1882
NaN
NaN
NaN
85.0
NaN
NaN
NaN
NaN
NaN
80.0
...
8.0
25.0
NaN
NaN
9.0
NaN
17.0
32.0
21.0
NaN
1883
NaN
NaN
NaN
105.0
NaN
NaN
NaN
NaN
NaN
79.0
...
NaN
23.0
NaN
NaN
10.0
NaN
11.0
35.0
25.0
NaN
1884
NaN
NaN
NaN
97.0
NaN
NaN
NaN
NaN
NaN
98.0
...
13.0
31.0
NaN
NaN
14.0
6.0
8.0
58.0
27.0
NaN
1885
NaN
NaN
NaN
88.0
NaN
6.0
NaN
NaN
NaN
88.0
...
6.0
27.0
NaN
NaN
12.0
6.0
14.0
48.0
38.0
NaN
1886
NaN
NaN
NaN
86.0
NaN
NaN
NaN
NaN
NaN
84.0
...
13.0
25.0
NaN
NaN
8.0
NaN
20.0
52.0
43.0
NaN
1887
NaN
NaN
NaN
78.0
NaN
NaN
NaN
NaN
NaN
104.0
...
9.0
34.0
NaN
NaN
23.0
NaN
28.0
46.0
33.0
NaN
1888
NaN
NaN
NaN
90.0
NaN
NaN
NaN
NaN
NaN
137.0
...
11.0
42.0
NaN
NaN
23.0
7.0
30.0
42.0
45.0
NaN
1889
NaN
NaN
NaN
85.0
NaN
NaN
NaN
NaN
NaN
107.0
...
14.0
29.0
NaN
NaN
22.0
NaN
29.0
53.0
55.0
NaN
1890
NaN
NaN
NaN
96.0
NaN
NaN
NaN
6.0
NaN
140.0
...
NaN
42.0
NaN
NaN
32.0
7.0
27.0
60.0
65.0
NaN
1891
NaN
NaN
NaN
69.0
NaN
NaN
NaN
NaN
NaN
124.0
...
NaN
34.0
NaN
NaN
29.0
6.0
14.0
52.0
45.0
NaN
1892
NaN
NaN
NaN
95.0
NaN
NaN
NaN
NaN
NaN
119.0
...
NaN
34.0
NaN
NaN
27.0
NaN
25.0
66.0
53.0
NaN
1893
NaN
NaN
NaN
81.0
NaN
NaN
NaN
NaN
NaN
115.0
...
NaN
23.0
NaN
NaN
34.0
6.0
15.0
67.0
70.0
NaN
1894
NaN
NaN
NaN
79.0
NaN
NaN
NaN
NaN
NaN
118.0
...
NaN
28.0
NaN
NaN
51.0
NaN
23.0
66.0
64.0
NaN
1895
NaN
NaN
NaN
94.0
NaN
NaN
NaN
NaN
NaN
92.0
...
NaN
34.0
NaN
NaN
60.0
11.0
38.0
55.0
55.0
NaN
1896
NaN
NaN
NaN
69.0
NaN
NaN
NaN
NaN
NaN
121.0
...
NaN
36.0
NaN
NaN
47.0
NaN
38.0
72.0
65.0
NaN
1897
NaN
NaN
NaN
87.0
NaN
NaN
NaN
NaN
NaN
97.0
...
NaN
35.0
NaN
NaN
51.0
NaN
28.0
67.0
79.0
NaN
1898
NaN
NaN
NaN
89.0
NaN
NaN
NaN
NaN
NaN
120.0
...
NaN
30.0
NaN
NaN
62.0
NaN
28.0
65.0
83.0
NaN
1899
NaN
NaN
NaN
71.0
NaN
NaN
NaN
NaN
NaN
87.0
...
NaN
27.0
NaN
NaN
49.0
6.0
31.0
56.0
60.0
NaN
1900
NaN
NaN
NaN
103.0
NaN
NaN
NaN
NaN
NaN
112.0
...
NaN
26.0
NaN
NaN
48.0
9.0
44.0
99.0
71.0
NaN
1901
NaN
NaN
NaN
80.0
NaN
NaN
NaN
NaN
NaN
87.0
...
NaN
26.0
NaN
NaN
56.0
NaN
31.0
58.0
57.0
NaN
1902
NaN
NaN
NaN
78.0
NaN
NaN
NaN
NaN
NaN
91.0
...
NaN
34.0
NaN
NaN
58.0
NaN
23.0
58.0
66.0
NaN
1903
NaN
NaN
NaN
93.0
NaN
NaN
NaN
NaN
NaN
91.0
...
NaN
19.0
NaN
NaN
64.0
NaN
41.0
83.0
74.0
NaN
1904
NaN
NaN
NaN
117.0
NaN
NaN
NaN
NaN
NaN
80.0
...
NaN
27.0
NaN
NaN
46.0
NaN
35.0
54.0
74.0
NaN
1905
NaN
NaN
NaN
96.0
NaN
NaN
NaN
NaN
NaN
73.0
...
NaN
24.0
NaN
NaN
66.0
8.0
24.0
55.0
61.0
NaN
1906
NaN
NaN
NaN
96.0
NaN
NaN
NaN
NaN
NaN
72.0
...
NaN
19.0
NaN
NaN
59.0
NaN
37.0
64.0
58.0
NaN
1907
NaN
NaN
NaN
130.0
NaN
NaN
NaN
NaN
NaN
79.0
...
NaN
19.0
NaN
NaN
53.0
11.0
39.0
92.0
72.0
NaN
1908
NaN
NaN
NaN
114.0
NaN
NaN
NaN
NaN
NaN
84.0
...
NaN
23.0
NaN
NaN
70.0
NaN
31.0
59.0
53.0
NaN
1909
NaN
NaN
NaN
142.0
NaN
NaN
NaN
NaN
NaN
57.0
...
NaN
22.0
NaN
NaN
59.0
NaN
39.0
57.0
76.0
NaN
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
1985
NaN
NaN
NaN
13134.0
NaN
NaN
NaN
NaN
314.0
233.0
...
NaN
194.0
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
1986
NaN
NaN
NaN
12690.0
NaN
NaN
NaN
NaN
370.0
228.0
...
NaN
213.0
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
1987
NaN
NaN
NaN
12678.0
NaN
NaN
NaN
NaN
327.0
228.0
...
NaN
247.0
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
1988
NaN
NaN
NaN
14397.0
NaN
NaN
NaN
NaN
404.0
226.0
...
NaN
241.0
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
1989
NaN
NaN
NaN
15314.0
NaN
NaN
NaN
NaN
470.0
265.0
...
NaN
376.0
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
1990
NaN
NaN
NaN
14550.0
NaN
NaN
NaN
NaN
507.0
313.0
...
NaN
478.0
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
1991
NaN
NaN
NaN
14240.0
NaN
NaN
NaN
NaN
451.0
276.0
...
NaN
722.0
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
1992
NaN
NaN
NaN
14506.0
NaN
NaN
NaN
NaN
430.0
260.0
...
NaN
981.0
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
1993
NaN
NaN
NaN
13825.0
NaN
NaN
NaN
NaN
503.0
292.0
...
NaN
1193.0
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
1994
NaN
1451.0
NaN
14380.0
NaN
NaN
NaN
NaN
597.0
351.0
...
NaN
1333.0
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
1995
NaN
1255.0
NaN
13286.0
NaN
NaN
NaN
NaN
549.0
351.0
...
NaN
1726.0
219.0
NaN
NaN
NaN
NaN
NaN
NaN
NaN
1996
NaN
831.0
NaN
11969.0
NaN
NaN
NaN
NaN
552.0
349.0
...
NaN
2064.0
339.0
NaN
NaN
NaN
NaN
NaN
NaN
NaN
1997
NaN
1738.0
NaN
11166.0
NaN
NaN
NaN
NaN
645.0
386.0
...
NaN
2362.0
407.0
NaN
NaN
NaN
NaN
NaN
NaN
NaN
1998
NaN
1399.0
NaN
10544.0
NaN
NaN
NaN
NaN
661.0
398.0
...
NaN
2692.0
478.0
225.0
NaN
NaN
NaN
NaN
NaN
NaN
1999
NaN
1088.0
NaN
9852.0
NaN
NaN
211.0
NaN
710.0
430.0
...
NaN
3237.0
563.0
257.0
NaN
NaN
NaN
NaN
NaN
NaN
2000
NaN
1495.0
NaN
9551.0
NaN
NaN
222.0
NaN
660.0
432.0
...
NaN
3785.0
691.0
320.0
NaN
NaN
NaN
NaN
NaN
NaN
2001
NaN
3352.0
NaN
9534.0
NaN
NaN
244.0
NaN
687.0
526.0
...
NaN
4644.0
822.0
439.0
NaN
NaN
NaN
NaN
NaN
NaN
2002
NaN
4778.0
NaN
8999.0
NaN
NaN
256.0
NaN
600.0
514.0
...
NaN
4884.0
1182.0
438.0
NaN
NaN
NaN
NaN
NaN
NaN
2003
NaN
3671.0
NaN
8859.0
NaN
NaN
276.0
NaN
625.0
536.0
...
NaN
5085.0
1469.0
449.0
NaN
NaN
NaN
NaN
NaN
NaN
2004
NaN
3486.0
NaN
8386.0
NaN
NaN
258.0
NaN
504.0
500.0
...
NaN
5362.0
1622.0
515.0
NaN
NaN
NaN
NaN
NaN
NaN
2005
NaN
3456.0
NaN
7799.0
NaN
NaN
287.0
NaN
452.0
445.0
...
NaN
4957.0
2270.0
502.0
NaN
NaN
NaN
NaN
NaN
NaN
2006
NaN
3742.0
NaN
8291.0
NaN
NaN
298.0
NaN
404.0
440.0
...
NaN
5152.0
2848.0
531.0
NaN
NaN
NaN
NaN
NaN
NaN
2007
NaN
3952.0
NaN
8933.0
NaN
NaN
313.0
NaN
349.0
468.0
...
NaN
4931.0
3031.0
527.0
NaN
NaN
NaN
NaN
NaN
NaN
2008
956.0
4038.0
219.0
8536.0
NaN
NaN
320.0
NaN
344.0
401.0
...
NaN
4779.0
3445.0
493.0
NaN
NaN
NaN
NaN
NaN
NaN
2009
1267.0
4366.0
270.0
7966.0
NaN
NaN
297.0
NaN
307.0
370.0
...
NaN
5144.0
3991.0
499.0
NaN
NaN
NaN
NaN
NaN
NaN
2010
450.0
4659.0
438.0
7458.0
227.0
NaN
281.0
NaN
299.0
327.0
...
NaN
6263.0
5200.0
508.0
NaN
NaN
NaN
NaN
NaN
259.0
2011
274.0
5105.0
436.0
7610.0
NaN
NaN
NaN
NaN
287.0
339.0
...
NaN
6294.0
6394.0
523.0
NaN
NaN
NaN
NaN
NaN
313.0
2012
223.0
5499.0
435.0
7519.0
NaN
NaN
NaN
NaN
NaN
342.0
...
NaN
6445.0
7457.0
516.0
NaN
NaN
NaN
NaN
NaN
434.0
2013
203.0
5217.0
495.0
7289.0
NaN
NaN
NaN
NaN
NaN
NaN
...
NaN
5967.0
7224.0
431.0
NaN
NaN
NaN
NaN
NaN
566.0
2014
NaN
9742.0
NaN
14736.0
NaN
NaN
NaN
NaN
NaN
NaN
...
NaN
11714.0
14768.0
NaN
NaN
NaN
NaN
NaN
NaN
1328.0
135 rows × 6994 columns
In [48]:
%matplotlib notebook
import matplotlib
import matplotlib.pyplot as plt
In [54]:
subset = total_births[['Victor', 'Harry', 'Mary', 'Marilyn']]
In [52]:
subset.plot(subplots=True, figsize=(12, 10), grid=False, title="Number of births per year")
Out[52]:
array([<matplotlib.axes._subplots.AxesSubplot object at 0x7f08dacdf110>,
<matplotlib.axes._subplots.AxesSubplot object at 0x7f08aa4d3790>,
<matplotlib.axes._subplots.AxesSubplot object at 0x7f08aa4a9690>,
<matplotlib.axes._subplots.AxesSubplot object at 0x7f08aa3cd210>], dtype=object)
In [55]:
table = top1000.pivot_table('prop', index='year', columns='sex', aggfunc=sum)
In [57]:
table.plot(title='Sum of table1000.prop by year and sex', yticks=np.linspace(0, 1.2, 13), xticks=range(1880, 2020, 10))
Out[57]:
<matplotlib.axes._subplots.AxesSubplot at 0x7f08aa1cef50>
In [58]:
df = boys[boys.year == 2010]
In [59]:
df
Out[59]:
name
sex
births
year
prop
year
sex
2010
M
1710685
Jacob
M
22095
2010
0.011540
1710686
Ethan
M
17993
2010
0.009398
1710687
Michael
M
17324
2010
0.009048
1710688
Jayden
M
17158
2010
0.008962
1710689
William
M
17036
2010
0.008898
1710690
Alexander
M
16746
2010
0.008746
1710691
Noah
M
16438
2010
0.008585
1710692
Daniel
M
15819
2010
0.008262
1710693
Aiden
M
15520
2010
0.008106
1710694
Anthony
M
15475
2010
0.008083
1710695
Joshua
M
15425
2010
0.008056
1710696
Mason
M
14836
2010
0.007749
1710697
Christopher
M
14259
2010
0.007447
1710698
Andrew
M
14227
2010
0.007431
1710699
David
M
14176
2010
0.007404
1710700
Matthew
M
14114
2010
0.007372
1710701
Logan
M
14014
2010
0.007319
1710702
Elijah
M
13875
2010
0.007247
1710703
James
M
13861
2010
0.007240
1710704
Joseph
M
13806
2010
0.007211
1710705
Gabriel
M
12859
2010
0.006716
1710706
Benjamin
M
12421
2010
0.006487
1710707
Ryan
M
11964
2010
0.006249
1710708
Samuel
M
11948
2010
0.006240
1710709
Jackson
M
11812
2010
0.006169
1710710
John
M
11543
2010
0.006029
1710711
Nathan
M
11367
2010
0.005937
1710712
Jonathan
M
11113
2010
0.005804
1710713
Christian
M
11084
2010
0.005789
1710714
Liam
M
10924
2010
0.005706
...
...
...
...
...
...
...
Ronaldo
M
203
2010
0.000106
1711656
Yair
M
203
2010
0.000106
1711657
Kael
M
203
2010
0.000106
1711654
Gibson
M
202
2010
0.000106
1711658
Keyon
M
202
2010
0.000106
1711659
Reagan
M
202
2010
0.000106
1711660
Kingsley
M
201
2010
0.000105
1711661
Talan
M
201
2010
0.000105
1711662
Yehuda
M
201
2010
0.000105
1711663
Jordon
M
200
2010
0.000104
1711667
Slade
M
200
2010
0.000104
1711669
Sheldon
M
200
2010
0.000104
1711668
Daylen
M
200
2010
0.000104
1711666
Dashawn
M
200
2010
0.000104
1711665
Cristofer
M
200
2010
0.000104
1711664
Clarence
M
199
2010
0.000104
1711670
Kadin
M
199
2010
0.000104
1711671
Masen
M
199
2010
0.000104
1711672
Rowen
M
199
2010
0.000104
1711673
Clinton
M
198
2010
0.000103
1711674
Dillan
M
198
2010
0.000103
1711675
Thaddeus
M
198
2010
0.000103
1711676
Yousef
M
198
2010
0.000103
1711677
Truman
M
197
2010
0.000103
1711678
Joziah
M
196
2010
0.000102
1711683
Simeon
M
196
2010
0.000102
1711686
Reuben
M
196
2010
0.000102
1711685
Keshawn
M
196
2010
0.000102
1711684
Destin
M
196
2010
0.000102
1711680
Enoch
M
196
2010
0.000102
1000 rows × 5 columns
In [60]:
prop_cumsum = df.sort_values(by='prop', ascending=False).prop.cumsum()
In [61]:
prop_cumsum[:10]
Out[61]:
year sex
2010 M 1710685 0.011540
1710686 0.020938
1710687 0.029986
1710688 0.038947
1710689 0.047845
1710690 0.056592
1710691 0.065177
1710692 0.073439
1710693 0.081545
1710694 0.089628
Name: prop, dtype: float64
In [62]:
df = boys[boys.year == 1900]
In [64]:
in1900 = df.sort_values(by='prop', ascending=False).prop.cumsum()
In [65]:
in1900.searchsorted(0.5) + 1
Out[65]:
array([25])
In [68]:
def get_quantile_count(group, q=0.5):
group = group.sort_values(by='prop', ascending=False)
return group.prop.cumsum().searchsorted(q) + 1
In [69]:
diversity = top1000.groupby(['year', 'sex']).apply(get_quantile_count)
In [70]:
diversity = diversity.unstack('sex')
In [74]:
diversity
Out[74]:
sex
F
M
year
1880
[38]
[14]
1881
[38]
[14]
1882
[38]
[15]
1883
[39]
[15]
1884
[39]
[16]
1885
[40]
[16]
1886
[41]
[16]
1887
[41]
[17]
1888
[42]
[17]
1889
[43]
[18]
1890
[44]
[19]
1891
[44]
[20]
1892
[44]
[20]
1893
[44]
[21]
1894
[45]
[22]
1895
[46]
[22]
1896
[46]
[23]
1897
[46]
[23]
1898
[47]
[24]
1899
[47]
[25]
1900
[49]
[25]
1901
[49]
[25]
1902
[49]
[26]
1903
[49]
[27]
1904
[50]
[28]
1905
[50]
[28]
1906
[49]
[28]
1907
[50]
[30]
1908
[49]
[30]
1909
[49]
[30]
...
...
...
1985
[72]
[36]
1986
[74]
[38]
1987
[75]
[39]
1988
[78]
[40]
1989
[83]
[43]
1990
[90]
[45]
1991
[95]
[48]
1992
[102]
[51]
1993
[107]
[54]
1994
[112]
[57]
1995
[115]
[60]
1996
[122]
[64]
1997
[129]
[67]
1998
[138]
[70]
1999
[146]
[73]
2000
[155]
[77]
2001
[165]
[81]
2002
[170]
[83]
2003
[179]
[87]
2004
[191]
[92]
2005
[199]
[96]
2006
[209]
[99]
2007
[223]
[103]
2008
[234]
[109]
2009
[241]
[114]
2010
[246]
[117]
2011
[244]
[120]
2012
[248]
[124]
2013
[241]
[126]
2014
[483]
[262]
135 rows × 2 columns
In [80]:
diversity[['F', 'M']] = diversity[['F', 'M']].astype(int)
diversity.dtypes
diversity.plot(title = 'Number of popular names in top 50%')
Out[80]:
<matplotlib.axes._subplots.AxesSubplot at 0x7f08aa19a950>
In [81]:
get_last_letter = lambda x: x[-1]
last_letters = names.name.map(get_last_letter)
last_letters.name = 'last_letter'
table = names.pivot_table('births', index=last_letters, columns=['sex', 'year'], aggfunc=sum)
In [83]:
subtable = table.reindex(columns=[1910, 1960, 2010], level='year')
In [84]:
subtable.head()
Out[84]:
sex
F
M
year
1910
1960
2010
1910
1960
2010
last_letter
a
108398.0
691271.0
676151.0
977.0
5212.0
28837.0
b
NaN
694.0
454.0
411.0
3912.0
39229.0
c
5.0
49.0
954.0
482.0
15463.0
23325.0
d
6751.0
3728.0
2635.0
22113.0
262168.0
44780.0
e
133601.0
435056.0
316425.0
28665.0
178817.0
130130.0
In [85]:
subtable.sum()
Out[85]:
sex year
F 1910 396503.0
1960 2022121.0
2010 1773440.0
M 1910 194216.0
1960 2132756.0
2010 1914629.0
dtype: float64
In [86]:
letter_prop = subtable / subtable.sum().astype(float)
In [87]:
fig, axes = plt.subplots(2, 1, figsize=(10, 8))
letter_prop['M'].plot(kind='bar', rot=0, ax=axes[0], title='Male')
letter_prop['F'].plot(kind='bar', rot=0, ax=axes[1], title='Female', legend=False)
Out[87]:
<matplotlib.axes._subplots.AxesSubplot at 0x7f08a9e0a110>
In [88]:
letter_prop = table / table.sum().astype(float)
In [89]:
dny_ts = letter_prop.ix[['d', 'n', 'y'], 'M'].T
In [90]:
dny_ts.head()
Out[90]:
last_letter
d
n
y
year
1880
0.083057
0.153217
0.075763
1881
0.083242
0.153212
0.077455
1882
0.085332
0.149561
0.077538
1883
0.084051
0.151653
0.079148
1884
0.086121
0.149926
0.080407
In [91]:
dny_ts.plot()
Out[91]:
<matplotlib.axes._subplots.AxesSubplot at 0x7f08a996ba50>
In [92]:
all_names = top1000.name.unique()
In [93]:
mask = np.array(['lesl' in x.lower() for x in all_names])
In [94]:
lesley_like = all_names[mask]
In [97]:
np.array(['Leslie', 'Lesley', 'Leslee', 'Lesli', 'Lesly'], dtype=object)
Out[97]:
array(['Leslie', 'Lesley', 'Leslee', 'Lesli', 'Lesly'], dtype=object)
In [98]:
filtered = top1000[top1000.name.isin(lesley_like)]
In [100]:
filtered.groupby('name').births.sum()
Out[100]:
name
Leslee 993
Lesley 35032
Lesli 929
Leslie 376158
Lesly 11155
Name: births, dtype: int64
In [101]:
table = filtered.pivot_table('births', index='year', columns='sex', aggfunc='sum')
In [102]:
table = table.div(table.sum(1), axis=0)
In [103]:
table.tail()
Out[103]:
sex
F
M
year
2010
1.0
NaN
2011
1.0
NaN
2012
1.0
NaN
2013
1.0
NaN
2014
1.0
NaN
In [104]:
table.plot(style={'M': 'k-', 'F': 'k--'})
Out[104]:
<matplotlib.axes._subplots.AxesSubplot at 0x7f08a9845790>
In [ ]:
Content source: batazor/MyExampleAndExperiments
Similar notebooks: