如何在循环中填充DataFrame并保证tmax数据可正常绘图
错误根因
- 你当前将每个站点完整的
tmax序列(Series对象)作为单个元素存入LargeFrame的tmax列,导致该列数据类型为object,没有可直接绘图的数值,因此触发报错。 - 原绘图代码逻辑存在问题:
for j in LargeFrame遍历的是DataFrame的列名(即tmax、meanmax两个列),而非遍历站点,和需求预期不符。
推荐解决方案
根据你的使用场景,可选择以下两种常用的DataFrame组织方式:
方案1:长表结构(适合分组统计、单站点独立分析)
该结构下每行对应单站点单日的气温数据,同时保留站点的整体平均温,后续统计、绘图灵活性最高:
import pandas as pd d = [] for station_name, df in TempDict.items(): # 转换tmax为数值类型 df['tmax'] = pd.to_numeric(df['tmax'], errors='coerce') # 计算站点平均最高温 mean_max = df['tmax'].mean() # 追加站点标识、平均温字段 df['station'] = station_name df['meanmax'] = mean_max d.append(df) # 合并为全量长表 LargeFrame = pd.concat(d, ignore_index=True)
绘图方式:按站点分组遍历绘图即可
for station, group in LargeFrame.groupby('station'): # 把x替换为你数据中存储日期的列名即可 group.plot(x='date', y='tmax', title=f"{station} 最高温时序")
方案2:宽表结构(适合多站点时序对比)
该结构下每列对应一个站点的tmax序列,可直接批量绘制所有站点的对比曲线,平均温单独存储:
import pandas as pd tmax_wide = pd.DataFrame() mean_max_dict = {} for station_name, df in TempDict.items(): tmax = pd.to_numeric(df['tmax'], errors='coerce') tmax_wide[station_name] = tmax mean_max_dict[station_name] = tmax.mean() # 平均温可单独存为Series mean_max_series = pd.Series(mean_max_dict, name='meanmax')
绘图方式:直接调用plot方法即可一次性生成所有站点的对比曲线
tmax_wide.plot(title="各站点最高温对比")
临时兼容方案(不改动原存储结构)
如果你一定要保留原有的「每行对应一个站点,单元格存完整tmax序列」的存储结构,只需修改绘图代码,取出每个单元格内的Series再绘图即可:
# 遍历站点索引而非列 for station in LargeFrame.index: LargeFrame.loc[station, 'tmax'].plot(title=station)
内容的提问来源于stack exchange,提问作者Megan Martin
相关产品推荐
相关产品推荐

