data = pd.merge(pd.merge(ratings, users), movies)
data
data.iloc[0]
使用merge函数将ratings,users和movies进行合并,保留了三个DataFrame中所有的数据,并将他们之间重复的数据和行进行合并。合并生成名为data的新DataFrame,并输出整个数据以及读取第一行数据。
mean_ratings = data.pivot_table("rating", index="title",
columns="gender", aggfunc="mean")
mean_ratings.head(5)
使用pivot_table函数实现数据透视表功能,对rating中title列求均值,columns参数就是用来显示字符型数据的,显示性别数据。求均值生成名为mean_ratings的新DataFrame,并读取输出前五行数据。
ratings_by_title = data.groupby("title").size()
ratings_by_title.head()
active_titles = ratings_by_title.index[ratings_by_title >= 250]
active_titles
使用groupby函数对data这一DataFrame按照电影名称title分组,并计算每个电影标题对应的评分数量。第二行代码显示每个电影标题对应的评分数量。第三四行代码统计对应评分数量大于250的电影标题将其定义为active_titles并输出。
mean_ratings = mean_ratings.loc[active_titles]
mean_ratings
读取mean_ratings中评分数量大于250的电影标题对应的数据并输出。
mean_ratings = mean_ratings.rename(index={"Seven Samurai (The Magnificent Seven) (Shichinin no samurai) (1954)":
"Seven Samurai (Shichinin no samurai) (1954)"})
使用rename函数将mean_ratings中Seven Samurai (The Magnificent Seven) (Shichinin no samurai) (1954)重新更改为Seven Samurai (Shichinin no samurai) (1954)。
top_female_ratings = mean_ratings.sort_values("F", ascending=False)
top_female_ratings.head()
根据女性的评分使用排序函数对mean_ratings进行降序排序并输出。
mean_ratings["diff"] = mean_ratings["M"] - mean_ratings["F"]
用mean_ratings中男性评分减去女性评分计算出男女评分差异diff。
sorted_by_diff = mean_ratings.sort_values("diff")
sorted_by_diff.head()
根据diff列的值使用排序函数对mean_ratings进行升序排序并输出。
sorted_by_diff[::-1].head()
使用切片操作对diff进行逆序排序,并输出。
rating_std_by_title = data.groupby("title")["rating"].std()
rating_std_by_title = rating_std_by_title.loc[active_titles]
rating_std_by_title.head()
std函数用于表示标准差。对电影标题title根据评分标准差分组。并读取活跃标题(评分数量大于250的电影标题)的标准差输出。
rating_std_by_title.sort_values(ascending=False)[:10]
根据评分标准差进行降序排序并读取前十行,也即输出评分标准差最大的十个电影标题。
movies["genres"].head()
movies["genres"].head().str.split("|")
movies["genre"] = movies.pop("genres").str.split("|")
movies.head()
读取电影中genres列数据,并通过|分隔开。将分割后的数据命名为genre列,原数据列genres删除。
movies_exploded = movies.explode("genre")
movies_exploded[:10]
使用explode函数将genre列中分割的数据展开成单独的几列数据并记为movies_exploded这个新DataFrame,输出前十行数据。
ratings_with_genre = pd.merge(pd.merge(movies_exploded, ratings), users)
ratings_with_genre.iloc[0]
genre_ratings = (ratings_with_genre.groupby(["genre", "age"])
["rating"].mean()
.unstack("age"))
genre_ratings[:10]
将movies_exploded,ratings,users这三个合并起来生成一个新DataFrame,并读取第一行数据。按照genre和age进行分组,并计算每个组评分的平均值,使用unstack函数将结果重塑为以age为列索引的形式。
3.2 美国1880-2010年的婴儿名字
美国社会保障局(SSA)提供了从1880年至现在的婴儿姓名频率的数据。可以使用这些数据做很多事情:根据给定的名字对婴儿名字随时间的比例进行可视化,确定一个名字的相对排位,确定每年最受欢迎的名字,或者流行程度最高或最低的名字
数据集下载地址:http://github.com/wesm/pydata-book
names1880 = pd.read_csv("datasets/babynames/yob1880.txt",
names=["name", "sex", "births"])
names1880
读取名为“yob1880.txt”文件,并将其列名设为name,sex,births。
names1880.groupby("sex")["births"].sum()
按照性别分组,并计算每组生日的总和。
pieces = []
for year in range(1880, 2011):
path = f"datasets/babynames/yob{year}.txt"
frame = pd.read_csv(path, names=["name", "sex", "births"])
# Add a column for the year
frame["year"] = year
pieces.append(frame)
# Concatenate everything into a single DataFrame
names = pd.concat(pieces, ignore_index=True)
names
提取从数据集中读取1880-2011年间的数据并生成names这个DataFrame。
total_births = names.pivot_table("births", index="year",
columns="sex", aggfunc=sum)
total_births.tail()
total_births.plot(title="Total births by sex and year")
使用pivot_table函数以births和sex分组的出生数总和,并显示最后几行。
绘制一个标题为Total births by sex and year的折线图。
def add_prop(group):
group["prop"] = group["births"] / group["births"].sum()
return group
names = names.groupby(["year", "sex"], group_keys=False).apply(add_prop)
names
定义一个增加组的函数add_prop,表示每个名字在出生年份和性别组中的比例,每个名字的出生率。
对names按照年份和性别分组,并对每组应用add_prop函数。
names.groupby(["year", "sex"])["prop"].sum()
通过年份和性别分组,并计算对每组中的每个名字比例的总和。
def get_top1000(group):
return group.sort_values("births", ascending=False)[:1000]
grouped = names.groupby(["year", "sex"])
top1000 = grouped.apply(get_top1000)
top1000.head()
定义一个get_top1000的函数,该函数根据births进行降序排序,并取前1000行,也即births值最大的前1000。根据年份和性别分组,并对每个分组应用get_top1000函数。
top1000 = top1000.reset_index(drop=True)
top1000.head()
使用reset_index()函数对top1000 DataFrame 进行重置索引,并丢弃原始索引。设置drop=True可以移除原始索引列,以便在重置索引后不保留它。
boys = top1000[top1000["sex"] == "M"]
girls = top1000[top1000["sex"] == "F"]
total_births = top1000.pivot_table("births", index="year",
columns="name",
aggfunc=sum)
total_births.info()
subset = total_births[["John", "Harry", "Mary", "Marilyn"]]
subset.plot(subplots=True, figsize=(12, 10),
title="Number of births per year")
根据性别将top1000的值分为boys和girls两个数据集。并对births进行数据透视。
使用info()方法打印出total_births的全部数据,并选择John、Harry、Mary、Marilyn四个名字绘制标题为Number of births per year的折线图。
plt.figure()
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))
对prop进行数据透视图,绘制标题为Sum of table1000.prop by year and sex的折线图。
df = boys[boys["year"] == 2010]
df
得到2010年男孩出生人数表
prop_cumsum = df["prop"].sort_values(ascending=False).cumsum()
prop_cumsum[:10]
prop_cumsum.searchsorted(0.5)
对2010年男孩出生人数表中prop值进行降序排序并计算累计和,并提取前10行,使用 searchsorted() 方法找到累计和达到 0.5 时的索引位置。
df = boys[boys.year == 1900]
in1900 = df.sort_values("prop", ascending=False).prop.cumsum()
in1900.searchsorted(0.5) + 1
得到1900年男孩出生人数表, 对表中prop值进行降序排序并计算累计和, searchsorted() 方法找到累计和达到 0.5 时的后一个索引位置。
def get_quantile_count(group, q=0.5):
group = group.sort_values("prop", ascending=False)
return group.prop.cumsum().searchsorted(q) + 1
diversity = top1000.groupby(["year", "sex"]).apply(get_quantile_count)
diversity = diversity.unstack()
fig = plt.figure()
diversity.head()
diversity.plot(title="Number of popular names in top 50%")
定义一个get_quantile_count函数,对prop值进行降序排序并计算累计和, searchsorted() 方法找到累计和达到 0.5 时的后一个索引位置。
根据年份和性别分组,并对每组应用get_quantile_count函数,得到diversity这个新DataFrame,并绘制标题为Number of popular names in top 50%的折线图。
def get_last_letter(x):
return x[-1]
last_letters = names["name"].map(get_last_letter)
last_letters.name = "last_letter"
table = names.pivot_table("births", index=last_letters,
columns=["sex", "year"], aggfunc=sum)
subtable = table.reindex(columns=[1910, 1960, 2010], level="year")
subtable.head()
定义一个返回字符串最后一个字母的函数。
使用map函数对names中每一个名字提取最后一个字母。进行数据透视。
展示1910,1960,2010年的数据。
subtable.sum()
letter_prop = subtable / subtable.sum()
letter_prop
展示每个年份和性别组合中每个名字的总和,以及占比
import matplotlib.pyplot as plt
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)
导入matplotlib包分别以男生和女生绘制两幅柱状图。
letter_prop = table / table.sum()
dny_ts = letter_prop.loc[["d", "n", "y"], "M"].T
dny_ts.head()
统计最后男生中名字最后一个字母为d、n、y的比例。
并绘制折线图。
all_names = pd.Series(top1000["name"].unique())
lesley_like = all_names[all_names.str.contains("Lesl")]
lesley_like
从top1000 DataFrame的"name"列获取唯一的姓名,并将结果存储在all_names变量中。选择all_names中包含"Lesl"的姓名,并将结果赋值给lesley_like变量。显示lesley_like Series,即包含以"Lesl"开头的姓名。
filtered = top1000[top1000["name"].isin(lesley_like)]
filtered.groupby("name")["births"].sum()
根据top1000 DataFrame中的"name"列与lesley_like中的姓名进行匹配,筛选出匹配的行数据,并将结果赋值给filtered变量。 对filtered DataFrame按姓名进行分组,计算每个姓名的出生人数总和,并显示结果。
table = filtered.pivot_table("births", index="year",
columns="sex", aggfunc="sum")
table = table.div(table.sum(axis="columns"), axis="index")
table.tail()
根据年份和性别对filtered进行透视,计算每个年份和性别的出生人数总和,并将结果存储在table变量中。对table进行归一化,即每行的总和作为除数,计算每个年份和性别的归一化比例。table归一化后最后几行的结果。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注Python)
…(img-DE7OUfYy-1713223093019)]
[外链图片转存中…(img-xpNzWS25-1713223093020)]
[外链图片转存中…(img-iyocOz0L-1713223093020)]
[外链图片转存中…(img-mg0QeYwn-1713223093020)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注Python)