如何使用pandas合并两个CSV文件并绘制指定高校世界排名柱状图?
报错原因与解决办法
你遇到的TypeError: no numeric data to plot报错,核心问题不是year字段的类型,而是你指定用于y轴的world_rank_x(times榜单排名)、world_rank_y(上海交大榜单排名)两个字段为字符串类型。
这类高校排名榜单的原始数据里,排名列通常会包含特殊字符,比如并列排名的=3、排名区间的101-150,pandas读取CSV时会直接识别为字符串类型,无法作为数值列绘图,你之前只转换了year列的类型,没有处理排名列,因此报错依然存在。
修复步骤
- 清理两个排名列的特殊字符,提取有效数值后转换为整数/浮点类型,无法直接转换的区间排名可以根据需求取区间均值或者直接过滤
- 合并两个表时建议使用
inner连接,仅保留同时出现在两份榜单中的高校数据,避免空值干扰 - 绘图前可先执行
print(combined.dtypes)查看各字段类型,确认用于绘图的列均为数值类型
修复后完整代码
import pandas as pd import matplotlib.pyplot as plt # 读取数据 times_df = pd.read_csv("timesData.csv") shanghai_df = pd.read_csv("shanghaiData.csv") # 定义排名列清洗函数 def clean_rank(rank_str): # 提取排名中的数字部分,区间格式取起始值,也可根据需求改为取均值 if isinstance(rank_str, str): # 移除等号、拆分区间取第一个值 num_part = rank_str.replace('=', '').split('-')[0] return int(num_part) return rank_str # 清洗两个表的排名列 times_df['world_rank'] = times_df['world_rank'].apply(clean_rank) shanghai_df['world_rank'] = shanghai_df['world_rank'].apply(clean_rank) # 合并表,同时关联年份避免不同年份的排名错位 combined = times_df.merge(shanghai_df, on=['university_name', 'year'], how='inner', suffixes=('_times', '_shanghai')) # 筛选哈佛大学数据 harvard_data = combined.loc[combined['university_name']=='Harvard University'].copy() # 绘图 harvard_data.plot( kind = 'bar', x = 'year', y = ['world_rank_times', 'world_rank_shanghai'], figsize=(10,6), title='哈佛大学两份榜单世界排名对比' ) plt.ylabel('世界排名') plt.xlabel('年份') # 翻转y轴,排名越小数值越高更符合阅读习惯 plt.gca().invert_yaxis() plt.show()
注:如果不需要关联年份对齐数据,可以自行调整merge的关联条件。
内容的提问来源于stack exchange,提问作者SQL Learner 1
相关产品推荐
相关产品推荐

