You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

循环遍历列表创建Plotly折线图报ValueError问题排查

问题根因

这个报错是px.line()入参规则不匹配导致的:
当你给Plotly Express的绘图函数传入第一个参数为pandas数据对象(你的代码里是分组聚合得到的df_avg Series)时,x和y参数默认只接受对应数据的列名字符串,不接受直接传入完整的Series/数组对象。你当前代码同时传入了df_avg作为数据源,又直接把df_avg.index.to_timestamp()、df_avg两个完整序列作为x、y传入,Plotly会将其识别为多列引用列表,触发参数冲突报错。

另外你的循环逻辑还有一个隐藏bug:循环内筛选数据时写的是df2 = df2[df2.StationName== i],第一次循环执行完后df2就只剩第一个站点的子集,后续循环会拿不到其他站点的数据,最终得到空的聚合结果。

修复方法

修改两处逻辑即可:

  1. 修正循环筛选逻辑:用原始全量数据表df做单站点筛选,不要覆写遍历过程中用到的数据集,避免后续循环数据丢失
  2. 调整绘图传参方式:要么把聚合结果转成标准DataFrame后传列名给x、y,要么直接省略第一个数据源参数,只传x、y的序列值。

参考修复代码:

area_name = pd.unique(df["StationName"])
for i in area_name:
    print("Data for {} area".format(i))
    # 从原始全量数据筛选单站点数据,避免覆写数据集
    df_station = df[df.StationName == i]
    # 分组聚合后重置索引,转为标准DataFrame
    df_avg = df_station.groupby("month_year", as_index=False)['Price'].mean()
    # 转换时间格式
    df_avg["month_year"] = df_avg["month_year"].dt.to_timestamp()
    # 传列名作为x、y参数
    fig = px.line(
        df_avg,
        x="month_year",
        y="Price",
        labels={"month_year": "Period (Month/Year)", "Price": "Price (£)"},
        title='Average House Price in {0}'.format(i)
    )
    fig.show()

如果不想把聚合结果转成DataFrame,也可以直接去掉px.line()的第一个数据源参数,直接传入序列值:

fig = px.line(
    x = df_avg.index.to_timestamp(),
    y = df_avg.values,
    labels=dict(x="Period (Month/Year)", y="Price (£)"),
    title='Average House Price in {0}'.format(i)
)

这种写法下Plotly不会按列名规则解析参数,也不会触发该报错。

内容的提问来源于stack exchange,提问作者tim2022

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 16:34:47