《利用Python进行数据分析》-全美婴儿姓名案例

作者: 皮皮大 | 来源:发表于2019-08-15 15:52 被阅读5次

    知识点

    在全美婴儿名字案例中,使用到的方法有:

    • 按照sex分组按照births属性求和:groupby("sex").births.sum()
    • concat()用法:第一个参数以列表形式添加
    • pivot_table透视表制作
    image.png
    • 直接添加某列属性diffgroup['diff']=group['M] - group['F']
    • apply()用法
    • 查看DF数据信息:info()
    • 不同方式绘制可视图:


      image.png
      image.png
    • 查看DF数据框中的所有信息value,除去索引和属性
    • 累计求和:cumsum()
    • 归一化后寻找某个分界点的位置:searchsorted(0.5)
    • 对df中的name属性使用func函数:df.name.map(func)
    • 归一化处理:df/df.sum()
    • 挑选不重复元素:unique()
    • 字符串转化:str.lower():一定还要带上str
    • 字符串中是否包含:str.contains()
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    # 创建数据指定列属性
    data = pd.read_csv(r'D:\Python\datalearning\利用Python进行数据分析\pydata-book\datasets\babynames\yob1880.txt', 
                       names=['name', 'sex', 'births'])
    
    data.head()
    
    image.png
    # groupby使用:通过指定一个属性来求另一个的和
    data.groupby('sex').births.sum()
    
    image.png
    #  同一个路径下面,多个TXT文件合并封装到一个DF里面
    years = range(1880, 2011)
    pieces = []
    columns = ['name', 'sex', 'births']
    for year in years:
        path = r'D:\Python\datalearning\利用Python进行数据分析\pydata-book\datasets\babynames\yob{}.txt'.format(year)
        frame = pd.read_csv(path, names=columns)
        
        # 增加一列数据,属性是year;frame['year']中的
        frame['year'] = year
        pieces.append(frame)
        
    # concat方法:默认按行组合,加上ignore_index=True取消原始行号
    # concat 第一个参数必须是序列或者S或者DF数据,并且是列表的形式
    # 上面将所有的frame放进pieces中
    names = pd.concat(pieces, ignore_index=True)
    
    image.png

    数据透视pivot_table

    total_births = names.pivot_table('births', index='year', columns='sex', aggfunc=sum)
    
    total_births.head()
    
    image.png

    增加一列数据

    # prop列相当于是指定名字相对于总出生数的比例
    def add_group(group):
        group['prop'] = group.births / group.births.sum()
        return group
    
    # 先分组,再利用函数求比例
    names = names.groupby(['year', 'sex']).apply(add_group)
    names.groupby(['year', 'sex']).prop.sum().head()
    
    image.png
    image.png
    # DIY模式
    pieces = []
    for year, group in grouped:
        pieces.append(group.sort_values(by='births', ascending=False)[:1000])
    top1000 = pd.concat(pieces, ignore_index=True)
    

    分析命名趋势

    image.png
    # 挑选出4个名字
    subset = total_births[['John', 'Harry', 'Mary', 'Marilyn']]
    subset.head()
    
    # 绘图
    subset.plot(subplots=True, figsize=(12, 10), grid=False, 
               title="Number of births per year")
    
    image.png

    计算最流行的1000个名字的比例,按照year和sex聚合并绘图

    table = top1000.pivot_table("prop", index='year',
                               columns='sex', aggfunc=sum)
    
    table.plot(title='Sum of table1000.prop by year and sex', 
              yticks=np.linspace(0, 1.2, 13), xticks=range(1880, 2020, 10))
    
    image.png
    # 统计2010年男孩的名字;prop的降序排列
    df = boys[boys.year == 2010]
    df.head(20)
    
    # prop降序之后,通过累计求和,找出哪些名字加起来等于0.5
    # cumsum()累计求和
    prop_cumsum = df.sort_values(by='prop', ascending=False).prop.cumsum()
    prop_cumsum[:10]
    
    image.png
    diversity = top1000.groupby(['year', 'sex']).apply(get_quantile_count)
    diversity = diversity.unstack('sex')
    
    image.png

    最后一个字母的变革

    # 定义一个lambda函数,得到最后一个字母
    get_last_letter = lambda x: x[-1]
    # 通过map函数将上面的lambda应用在其中
    last_letters = names.name.map(get_last_letter)
    # 给last_letters命名为last_letter
    last_letters.name = 'last_letter'
    table = names.pivot_table('births', index=last_letters,
                              columns=['sex', 'year'], aggfunc=sum)
    
    # 归一化处理
    letter_prop = subtable / subtable.sum()
    letter_prop
    
    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)
    
    image.png
    image.png
    image.png

    男孩名字变成女孩名字

    # unique找出所有不重复的名字
    all_names = pd.Series(top1000.name.unique())
    
    # 先把名字变成小写,再看是否包含lesl
    lesley_like = all_names[all_names.str.lower().str.contains('lesl')]
    
    # 通过isin来过滤其他名字
    filtered = top1000[top1000.name.isin(lesley_like)]
    # 通过name属性来分组,再选择根据births属性来统计求和
    filtered.groupby('name').births.sum()
    
    image.png
    # 按照性别和年度进行聚合,年度进行规范化处理
    table = filtered.pivot_table("births", index='year',
                            columns='sex', aggfunc='sum')
    
    table = table.div(table.sum(1), axis=0)
    table.tail()
    
    image.png

    相关文章

      网友评论

        本文标题:《利用Python进行数据分析》-全美婴儿姓名案例

        本文链接:https://www.haomeiwen.com/subject/kkvzjctx.html