1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > python人名最多数统计_《利用Python进行数据分析》-全美婴儿姓名案例

python人名最多数统计_《利用Python进行数据分析》-全美婴儿姓名案例

时间:2023-05-05 07:50:42

相关推荐

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

字符串中是否包含: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, )

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, , 10))

image.png

# 统计男孩的名字;prop的降序排列

df = boys[boys.year == ]

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。