利用pandas模块处理百家姓数据
说在前面
“百家姓数据分析”程序功能相对复杂,涉及函数多,因此需要教师对pandas模块和DataFrame对象做简单介绍和示例演示,并为示例代码提供充分的注释,以帮助学生顺利理解示例代码;采用小组合作学习,将问题分解,每组同学只需完成其中一个任务,学有余力的同学可以完成多个任务。这样既明确了基本任务,使每一位同学都参与进来,又实现了分层教学的目标。
利用pandas模块处理百家姓数据
已有素材:浙江教育出版社(https://zjjy.zjcbcm.com/)提供了某地姓名数据csv文件,从中随机抽取了1000000条姓名数据。
学生活动1
教师讲解
初识DataFrame对象。
学生活动2
活动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: 统计和分析数据。
#!/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])
教师总结
总结和期望。
需要本文PPT、源代码和课后练习答案的,可以加入“Python算法之旅”知识星球参与讨论和下载文件,“Python算法之旅”知识星球汇集了数量众多的同好,更多有趣的话题在这里讨论,更多有用的资料在这里分享。
我们专注Python算法,感兴趣就一起来!
相关优秀文章:
评论