python⼈名最多数统计_《利⽤Python进⾏数据分析》-全美婴
⼉姓名案例
知识点
在全美婴⼉名字案例中,使⽤到的⽅法有:
按照sex分组按照births属性求和:groupby("sex").births.sum()
concat()⽤法:第⼀个参数以列表形式添加
pivot_table透视表制作
image.png
直接添加某列属性diff:group['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
字符串中是否包含:ains()
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\', names=['name', 'sex', 'births'])
data.head()
image.png
# groupby使⽤:通过指定⼀个属性来求另⼀个的和
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 = upby(['year', 'sex']).apply(add_group)
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 = ar == 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 = upby(['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().ains('lesl')]
# 通过isin来过滤其他名字
filtered = top1000[top1000.name.isin(lesley_like)]
# 通过name属性来分组,再选择根据births属性来统计求和
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