利用pandas模块处理百家姓数据

Python算法之旅

共 4727字,需浏览 10分钟

 ·

2021-12-12 14:30

说在前面

本节课让学生分析和编写“百家姓数据分析”程序,体验从制定项目目标、设计算法到编写和运行程序的全流程,可以帮助学生初步掌握使用pandas模块进行数据分析的基本方法及步骤。由于需要解决的实际问题比较复杂,教师要引导学生对问题做充分分析和讨论,为学生提供样例代码、函数说明和“半成品”源代码等文档资料,鼓励学生阅读和运行示例代码,并模仿范例对新项目进行简单修改和拓展。

“百家姓数据分析”程序功能相对复杂,涉及函数多,因此需要教师对pandas模块和DataFrame对象做简单介绍和示例演示,并为示例代码提供充分的注释,以帮助学生顺利理解示例代码;采用小组合作学习,将问题分解,每组同学只需完成其中一个任务,学有余力的同学可以完成多个任务。这样既明确了基本任务,使每一位同学都参与进来,又实现了分层教学的目标。

经典案例

利用pandas模块处理百家姓数据

已有素材:浙江教育出版社(https://zjjy.zjcbcm.com/)提供了某地姓名数据csv文件,从中随机抽取了1000000条姓名数据。


情境导入


学生活动1

活动1: 制定项目目标。
我这里有一个包含1百万条姓名记录的csv文件,请大家使用记事本打开这个文件,浏览一下其中存储的内容,思考你可以利用这些姓名记录挖掘出哪些有用或者有趣的信息?例如看看你的姓氏在百家姓中排名第几位?有多少与你同名的人等。(每人至少写出5条) 
教师巡回观察各组学生的讨论情况,请学生回答问题,并板书记录。


教师讲解

初识DataFrame对象。

教师简单介绍pandas模块、Series和DataFrame两种数据结构。
通过PPT展示DataFrame对象的行索引、列标题和值等常用属性。
运行示例代码,演示创建DataFrame对象的两种方法,并加以简要说明。


学生活动2

活动2: 拆分姓名。

已知读取的csv文件中每行只有一个姓名,如何将其拆分成姓氏和名字两个部分?如何判断姓氏是否为复姓?
使用何种数据结构来存储所有人的姓氏和名字?如何构建以姓名、姓氏和名字作为列标题的DateFrame对象?
学生口头回答完上述问题后,教师加以简单总结,并要求学生模仿示例代码中使用字典创建DataFrame对象的方法,完成作业1中代码填空。
教师巡回观察各组学生的学习和讨论情况,并对学生进行个别指导。
请完成作业1的学生上交作业,并挑选其中2份作业进行点评。

#!/usr/bin/python3# 文件名: 百家姓处理之拆分姓氏# 作者:巧若拙# 时间:2021-11-14
import pandas as pd
'''函数功能:读取csv文件并拆分名字,如果是复姓,则按照复姓处理。函数名:split_name(file_name)参数表:file_name -- 存储了姓名信息的csv文件。返回值:返回包含了姓氏、名字和人数列的DataFrame对象。'''def split_name(file_name): # 定义复姓 list fx = ['欧阳','太史','端木','上官','司马','东方','独孤','南宫','万俟','闻人','夏侯','诸葛','尉迟','公羊', '赫连','澹台','皇甫','宗政','濮阳','公冶','太叔','申屠','公孙','慕容','仲孙','钟离','长孙','宇文', '司徒','鲜于','司空','闾丘','子车','亓官','司寇','巫马','公西','颛孙','壤驷','公良','漆雕','乐正', '宰父','谷梁','拓跋','夹谷','轩辕','令狐','段干','百里','呼延','东郭','南门','羊舌','微生','公户', '公玉','公仪','梁丘','公仲','公上','公门','公山','公坚','左丘','公伯','西门','公祖','第五','公乘'] xm, xing, ming = [], [], [] #分别用来存储姓名、姓氏和名字 with open(file_name, 'r', encoding='utf-8') as file: #打开文件读取数据 for name in file: # 取姓、名,如果是复姓,则按照复姓处理 name = name.strip() #去除两侧空格和回车符 xm.append(name) #存储姓名 if name[0:2] in fx: p = 2 else: p = 第1 xing.append(name[:p]) #存储姓氏2#存储名字 #使用字典构造包含了姓名、姓氏和名字列的DataFrame对象(不含标题) data = {第3空} return pd.DataFrame(data)
#设置中英文字符对齐,以改善输出格式 pd.set_option('display.unicode.ambiguous_as_wide', True)pd.set_option('display.unicode.east_asian_width', True)
#直接读取文件到DataFrame对象file_name = 'names2.csv' #存储百家姓数据的文件df = pd.read_csv(file_name) print(df)print("#" * 50)
#读取csv文件并拆分名字,如果是复姓,则按照复姓处理df = split_name(file_name)print(df)

学生活动3

活动3: 统计和分析数据。

阅读参考资料,学习pandas常用函数和示例代码;模仿示例代码,根据注释将作业2中代码补充完整,运行程序,并根据程序运行结果回答如下问题:
问题1:输出和你同姓的人数?
问题2:看看你的姓氏排名第几位?
问题3:输出前n个最常见的姓氏?
问题4:输出前n个最常见的复姓?
除此之外,你还想知道哪些信息?请自行编程获取相关信息。
教师巡回观察各组学生的学习和讨论情况,并对学生进行个别指导。
将全部学生分成4组,每组重点回答其中一个问题;教师请学生代表口头回答问题,并运行和点评其上交的代码。
点评作业时,可重点讲解groupby()函数by参数的使用方法,count()函数的作用;可展示当不为sort_values()函数的inplace参数赋值时,代码的正确写法。

#!/usr/bin/python3# 文件名: 使用pandas处理百家姓数据# 作者:巧若拙# 时间:2021-11-14
import pandas as pd
def split_name(file_name): pass #代码略
#设置中英文字符对齐,以改善输出格式 pd.set_option('display.unicode.ambiguous_as_wide', True)pd.set_option('display.unicode.east_asian_width', True) #中英文字符对齐
file_name = 'names2.csv' #存储百家姓数据的文件df = split_name(file_name)#读取csv文件并拆分名字,如果是复姓,则按照复姓处理print(df)print("#" * 50)
#输出所有和你同名的人ming = '建国'print(df[df['名字']==ming])print("#" * 50)
#问题1:输出和你同姓的人数?xing = '梁'print(第4空)print("#" * 50)
#按“姓氏”分组计数,根据人数排名,并增加“排名”列xing_df = df.groupby('姓氏').count()xing_df['排名'] = xing_df['名字'].rank(ascending=False)
#问题2:看看你的姓氏排名第几位?print(xing_df.loc[['赵','钱','孙','李']]) #输出赵钱孙李的排名print("#" * 50)
n = 10#问题3:输出前n个最常见的姓氏?print("输出前n个最常见的姓氏:")xing_df = 第5# 按关键词“姓氏”分组计数xing_df.sort_values('姓名', ascending=False, inplace=True) #根据人数降序排序print(xing_df[:n])print("#" * 50)
#输出前n个最常见的名字print("输出前n个最常见的名字:")ming_df = df.groupby('名字').count() #按关键词“名字”分组计数ming_df.sort_values('姓名', ascending=False, inplace=True) #根据人数降序排序print(ming_df[:n])print("#" * 50)
#问题4:输出前n个最常见的复姓?print("输出前n个最常见的复姓:")xing_df = 第6#挑选出所有的复姓xing_df = xing_df.groupby('姓氏').count() #按关键词分组计数xing_df.sort_values('姓名', ascending=False, inplace=True) #根据人数降序排序print(xing_df[:n])print("#" * 50)
#输出前n个最常见的双名print("输出前n个最常见的双名:")ming_df = df[df['名字'].str.len()==2] #挑选出所有的双名ming_df = ming_df.groupby('名字').count() #按关键词分组计数ming_df.sort_values('姓名', ascending=False, inplace=True) #根据人数降序排序print(ming_df[:n])

教师总结

总结和期望。

教师总结本节课要点:创建DataFrame对象的两种方法,rank()、sort_value()和groupby()等函数的使用方法。
教师演示“百家姓数据分析和可视化”程序,让学生对下一节课的学习内容展开新的期望。


需要本文PPT、源代码和课后练习答案的,可以加入“Python算法之旅”知识星球参与讨论和下载文件,Python算法之旅”知识星球汇集了数量众多的同好,更多有趣的话题在这里讨论,更多有用的资料在这里分享。

我们专注Python算法,感兴趣就一起来!



相关优秀文章:

阅读代码和写更好的代码

最有效的学习方式

课堂1:海龟绘图之正四边形及其拓展

课堂2:海龟绘图之多彩螺旋线

课堂3:海龟绘图之绘制虚线

课堂4:循环结构经典案例

课堂5:解析算法经典案例

课堂6:枚举算法经典案例

课堂7:算法程序实现的综合应用

利用pandas模块处理学生成绩


浏览 28
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报