研究背景
美国社会保障总署(SSA)提供了一份从1880年到2010年的婴儿名字频率数据。我们可以用这个数据集做很多事,例如:
- 计算指定名字(可以是你自己的,也可以是别人的)的年度比例。
- 计算某个名字的相对排名。
- 计算各年度最流行的名字,以及增长或减少最快的名字。
- 分析名字趋势:元音、辅音、长度、总体多样性、拼写变化、首尾字母等。
- 分析外源性趋势:圣经中的名字、名人、人口结构变化等。
数据预处理
#查看数据
import numpy as np
import pandas as pd
pd.options.display.max_rows=10
names1880 = pd.read_csv(r'G:pydata-book-2nd-editiondatasetsbabynamesyob1880.txt',
names=['name','sex','births'])
names1880
我们可以用pandas.groupby()函数对births列的sex进行分组小计表示该年度的births总计:
names1880.groupby('sex')['births'].sum()
由于该数据集按年度被分隔成了多个文件,所以第一件事情就是要将所有数据都组装到一个DataFrame里面,并加上一个year字段。使用pandas.concat()即可达到这个目的:
years=range(1880,2011)
pieces=[]
columns = ['name','sex','births']
for year in years:
path=r'G:pydata-book-2nd-editiondatasetsbabynamesyob%d.txt' % year
frame=pd.read_csv(path,names=columns)
frame['year']=year
pieces.append(frame)
names=pd.concat(pieces,ignore_index=True)
names
这里需要注意几件事情。第一,concat默认是按行将多个DataFrame组合到一起的;第二,必须指定ignore_index=True,因为我们不希望保留read_csv所返回的原始行号。现在我们得到了一个非常大的DataFrame,它含有全部的名字数据:
有了这些数据之后,我们就可以利用groupby或pivot_table在year和sex级别上对其进