是不是此时感觉结构更清楚了?
df2 = pd.DataFrame() for info in data2['body']['medalTableDetail']: english_name = info['countryName'] name_id = info['countryId'] award_time = info['awardTime'] item_name = info['bigItemName'] sports_name = info['sportsName'] medal_type = info['medalType'] # 组织数据 orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]] # 然后追加df df2 = df2.append(orangized_data) df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型'] df2
结果如下:
3、数据预处理
对于爬取到的数据,往往是有问题的,我们需要提前预处理一下,方便后续做可视化展示。
① 数据替换
对于上述爬取到的数据,我们做一个数据筛选。
df1 = pd.read_excel("各国奖牌数.xlsx") df1[df1["名称"].str.contains("中国")]
结果如下:
虽说中国香港、中国台湾都单独参加了奥运会,但她们都属于中国,我们将她们的都改为中国,ID也都改为26。
df1["名称"].replace(["中国台北","中国香港"],"中国",inplace=True) df1["ID"].replace([31,38],26,inplace=True) df1[df1["名称"].str.contains("中国")]
结果如下:
② 数据分组
经过上述处理,那么中国就相当于有3条数据了。我们以名称+ID作为联合字段,进行分组,然后求和,将这3条数据进行合并。最后,再以金牌字段为基准,进行降序排列。
df2 = df1.groupby(["名称","ID"])[["金牌","银牌","铜牌","奖牌总数"]].sum().reset_index().sort_values(by="金牌",axis=0,ascending=False) df2.head(10)
结果如下:
③ 中英文名映射转换
由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。于是我在网上找到了下面这个文件:
我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件吧,方便我们以后直接使用。
with open("国家名中英文对照表.txt","r",encoding="utf-8") as f: x = f.read() df3 = pd.DataFrame() for i in x.split("\n"): x = i.split(":")[0].strip() y = i.split(":")[1].strip() orangined_data = [[x,y]] df3 = df3.append(orangined_data) df3.columns = ["名称","英文名称"] df3.to_excel("国家名中英文对照表.xlsx",index=None)
然后,在和上述的df2表格做一个左连接即可。
df4 = pd.merge(df2,df3,on="名称",how="left") df4
结果如下: