You need to enable JavaScript to run this app. 如何使用pandas合并两个CSV文件并绘制指定高校世界排名柱状图?
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 07:45:02