美国社会保障总署提供了一份从1880年到2010年的婴儿名字频率的数据,将其保存在name/的文件夹中。我们可以使用pandas.read_csv将其加载到Dataframe中
names1880 = pd.read_csv('names/yob1880.txt', names=['name', 'sex', 'births'])
print(names1880[:10])
输出结果:
name sex births
0 Mary F 7065
1 Anna F 2604
2 Emma F 2003
3 Elizabeth F 1939
4 Minnie F 1746
5 Margaret F 1578
6 Ida F 1472
7 Alice F 1414
8 Bertha F 1320
9 Sarah F 1288
我们可以用births列的sex分组小计表示该年度的birth总结:
group= names1880.groupby('sex').births.sum()
print(group)
输出结果:
sex
F 90993
M 110493
Name: births
由于该数据按年度被分隔为了多个文件,所以需要做的事情是将所有数据都组装到一个Dataframe中,再加上year字段,使用
pandas.concat即可达到目的:
years = range(1880, 2011)
pieces = []
columns = ['name', 'sex', 'births']
for year in years:
path = './names/yob%d.txt' %year
frame = pd.read_csv(path, names=columns)
frame['year'] = year
pieces.append(frame)
names= pd.concat(pieces, ignore_index=True)
print(names)
输出结果,太大各位自行运行。
有了这些数据以后我们就可以利用pivote_table在year和sex级别上对其进行聚合。
total_births = names.pivot_table('births', index='year',columns='sex', aggfunc= sum)
print(total_births.tail())
输出结果:
sex F M
year
2006 1896468 2050234
2007 1916888 2069242
2008 1883645 2032310
2009 1827643 1973359
2010 1759010 1898382
下面我们来插入一个prop列,用于存放指定名字的婴儿数相对于总出生数的比例。因此我们先按year和sex分组,然后将新的数列加到各个分组上:
def add_prop(group):
births = group.births.astype(float)
group['prop'] = births / births.sum()
return group
names = names.groupby(['year', 'sex']).apply(add_prop)
names_prop = names.pivot_table('prop', index='year',columns='sex')
names_prop.plot(title='Total Births prop by sex and year')
输出结果:


-
- 0000000000000000
-
1888 发帖7917 回复34980 积分
- 私信他 +关注
块
导
航
举报
请选择举报类别
- 广告垃圾
- 违规内容
- 恶意灌水
- 重复发帖