<jupyter_start><jupyter_text>1880-2010间全美婴儿姓名 数据集  数据读入——处理CSV格式数据集<jupyter_code>%pylab inline
import pandas as pd
# 该数据为非常标准的以逗号隔开的格式
names1880 = pd.read_csv('D:/PythonWorkSpace/Python for Data Analysis/Python for Data Analysis Source Code/ch02/names/yob1880.txt'
                       ,names = ['name','sex','births'])
names1880
# 通过对sex进行分组，对当年男女婴儿比例进行统计
names1880.groupby('sex').births.sum()
# 对于所给数据，实际上是按年份分隔的多个txt文件，现需要将所有数据都整合到一个DataFrame中
# 数据起止年份
years = range(1880,2011)
# 列表分别存储各个读入年份的DataFrame数据
pieces = []
# columns存储合并的整体DataFrame的column信息
columns = ['name','sex','births']

# 逐年迭代循环分别将该年份婴儿信息作为一项存入pieces[]中
for year in years:
    # 格式化字符串以实现逐个访问不用名的.txt
    path = 'D:/PythonWorkSpace/Python for Data Analysis/Python for Data Analysis Source Code/ch02/names/yob{year}.txt'.format(year = year)
    # 读入数据文件
    frame = pd.read_csv(path,names = columns)
    # 为读入的婴儿信息中添加一列year以区别不同年份
    frame['year'] = year
    # 逐个保存数据信息
    pieces.append(frame)
    
# 将保存在列表pieces中的所有DataFrame数据整合到单个DataFrame
# concat()默认按行将多个DataFrame整合；指定igone_index=True是为了不希望保留read_csv所返回的原始行号
names = pd.concat(pieces , ignore_index=True)
names
# 利用pivot_table()进行聚合，观察每年新生婴儿的男女比例
total_births = names.pivot_table('births',index='year',columns='sex',aggfunc=sum)
# total_births.tails()
total_births[-5:]
# 利用groupby()进行聚合，观察所有名字的出现次数，并降序排列观察前几名次
total_names = names.groupby('name').size().sort_values(ascending = False)
total_names.head()
# 对上述聚合的DataFrame信息进行绘图观察
total_births.plot(title='Total births by sex and year')
# 为分析指定姓名的婴儿相对于总出生数的比例
# 将names按year和sex进行分组，然后插入一个prop列加到各个分组上
def add_prop(group):
    # 整数除法向下取整，将数值转化为float准确计算分式
    births = group.births.astype(float)
    
    group['prop'] = births / births.sum()
    return group

names = names.groupby(['year','sex']).apply(add_prop)
names[:10]
# 数据集处理完毕，还需进行有效性检查
# 此处验证所有分组的prop总和是否都为1
# 调用np.allclose()检查该分组总和值是否足够接近于1（可能不会精确等于1）
np.allclose(names.groupby(['year','sex']).prop.sum(),1)
# 现在取出该数据子集（每对sex/year组合的前1000个名字）进行分析
def get_1000(group):
    return group.sort_values(by='births' , ascending=False)[:1000]

top_1000 = names.groupby(['year','sex']).apply(get_1000)
top_1000
# 接下来分析几个常见名字的命名趋势
# 首先将前1000个名字分成男女两个部分
boys = top_1000[top_1000.sex == 'M']
girls = top_1000[top_1000.sex == 'F']
# 随后生成一张按year和name统计的总出生数透视表
total_births = top_1000.pivot_table('births',index='year',columns='name',aggfunc=sum)
total_births
# 绘制曲线图观察数据
subset = total_births[['John','Harry','Mary','Marilyn']]
# subplots-bool 参数指定 是否分别绘制多个子图还是均绘制在一张图中
# figsize 参数指定 绘制图的大小
# grid 参数指定 是否在图中绘制网格
# title 参数指定 图名
subset.plot(subplots=True, figsize=(15,10), grid=False, title='Number of births per year')<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.13223757937990288, 'fraction_numerical': 0.03548748599178184, 'mean_word_length': 6.7398843930635834, 'pattern_counts': {'":': 0, '<': 5, '<?xml version=': 0, '>': 5, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 1, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '1', 'dir': 'jupyter-structured-clean-dedup', 'id': '88275', 'license': 'Apache-2.0', 'n_tokens_mistral': 1451, 'n_tokens_neox': 1485, 'n_words': 145, 'path': 'Python For Data Analysis/ch2_3.ipynb', 'repo_name': 'jercas/JupyterNotebook', 'size': '2677'}