[分享] Python Pandas之学习(Lesson_5)
556 查看
3 回复
 楼主 | 发布于 2018-05-06 | 只看楼主
分享到:

美国社会保障总署提供了一份从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')

输出结果:


(0 ) (0 )
回复 举报

回复于 2018-05-06 沙发

感谢分享;
(0 )
评论 (0) 举报

回复于 2018-05-07 2#

感谢分享
(0 )
评论 (0) 举报

回复于 2018-05-07 3#

谢谢分享!!!
(0 )
评论 (0) 举报
  • 发表回复
    0/3000





    举报

    请选择举报类别

    • 广告垃圾
    • 违规内容
    • 恶意灌水
    • 重复发帖

    全部板块

    返回顶部