遍历DataFrame行列用Plotly绘散点图遇ValueError,求解决方案
问题分析与解决
错误原因
你的代码存在两个核心问题:
- 参数传递错误:
px.scatter的x/y参数需要传入DataFrame的列名,或者与DataFrame长度匹配的数组。但你传入的row[column]是单个单元格的值(比如第一个循环里的AAPL),Plotly会误以为这是列名,但你的DataFrame里没有名为AAPL的列,因此抛出错误。 - 循环逻辑混乱:嵌套的
iterrows()循环会遍历每个单元格,每次创建仅包含单个点的图表,完全不符合“绘制各列数据散点图”的需求。
解决方案
首先需要将当前的宽格式DataFrame转换为Plotly更易处理的长格式(tidy data),再根据需求绘制散点图。
步骤1:预处理DataFrame
先移除无用的date列(从你的数据来看,该列无有效数据):
import pandas as pd import plotly.express as px # 假设你的DataFrame是df,先清理数据 df = df.drop('date', axis=1)
步骤2:转换为长格式
用pd.melt将日期列转为行数据,保留symbol作为标识:
melted_df = df.melt(id_vars='symbol', var_name='date', value_name='value')
转换后的数据结构示例:
| symbol | date | value |
|---|---|---|
| AAPL | 2023-03-01 | 3 |
| AMGN | 2023-03-01 | 0 |
| ... | ... | ... |
方案1:所有日期数据汇总到一个散点图
如果需要展示所有日期的数值分布,用日期做横轴,数值做纵轴,颜色区分股票:
fig = px.scatter(melted_df, x='date', y='value', color='symbol', hover_data=['symbol', 'date'], title='各股票每日数值散点图') fig.show()
方案2:按日期单独绘制散点图
如果需要为每个日期列单独生成散点图(展示当天各股票的数值),可以循环日期列:
# 获取所有日期列(排除symbol列) date_columns = df.columns[1:] for col in date_columns: fig = px.scatter(df, x='symbol', y=col, color='symbol', hover_data=['symbol'], title=f'{col} 各股票数值散点图') fig.show()
内容的提问来源于stack exchange,提问作者Ryan Shuell
相关产品推荐
相关产品推荐

