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

Plotly多折线图绘制含重复列名DataFrame报错求助

解决Plotly绘制含重复列名DataFrame的歧义错误问题

错误原因

当DataFrame存在重复列名时,直接传递df2.columns[1:]作为px.line的y参数,Plotly在解析重复列名时会触发内部逻辑的布尔判断歧义(重复列名的匹配会返回布尔Series而非单个布尔值),从而抛出ValueError: The truth value of a DataFrame is ambiguous。同时要适配可变列数,需确保所有列(包括重复列)都能被正确识别并绘制。

解决方案1:修改重复列名+长格式转换(推荐)

先为重复列名添加唯一后缀,再将DataFrame转为长格式后绘制,确保Plotly能正确区分每一列:

import plotly.express as px
import pandas as pd

def plot_all_df_columns(df):
    # 复制原DataFrame避免修改原始数据
    df_copy = df.copy()
    
    # 为重复列名添加唯一后缀
    col_names = pd.Series(df_copy.columns)
    for dup_col in col_names[col_names.duplicated()].unique():
        # 获取该重复列的所有索引,依次添加后缀
        dup_indices = col_names[col_names == dup_col].index.tolist()
        col_names[dup_indices] = [f"{dup_col}_{i+1}" for i in range(len(dup_indices))]
    df_copy.columns = col_names
    
    # 将索引转为普通列,再转成长格式
    df_long = df_copy.reset_index().melt(
        id_vars=df.index.name if df.index.name else "index",
        var_name="Column",
        value_name="Value"
    )
    
    # 绘制折线图
    fig = px.line(
        df_long,
        x=df.index.name if df.index.name else "index",
        y="Value",
        color="Column"
    )
    return fig

解决方案2:循环添加轨迹(保留原始列名)

如果需要保留原始重复列名,可通过循环为每一列单独添加绘制轨迹,绕开Plotly对重复列名的解析问题:

import plotly.express as px
import pandas as pd

def plot_all_df_columns(df):
    # 将索引转为普通列
    df_plot = df.reset_index()
    # 获取所有待绘制的列(排除原索引列)
    plot_cols = df_plot.columns[1:]
    
    # 初始化空图
    fig = px.line()
    # 循环添加每一列的轨迹
    for col in plot_cols:
        fig.add_scatter(
            x=df_plot.iloc[:, 0],
            y=df_plot[col],
            name=col
        )
    
    # 设置X轴标题
    fig.update_layout(
        xaxis_title=df.index.name if df.index.name else "Index"
    )
    return fig

测试示例

用含重复列名的DataFrame测试:

# 构造含重复Close列的示例DataFrame
data = {
    "Date": ["2023-01-01", "2023-01-02", "2023-01-03"],
    "Close": [100, 101, 102],
    "Close": [105, 106, 107],
    "Open": [99, 100, 101]
}
df2 = pd.DataFrame(data).set_index("Date")

# 调用函数绘制
fig = plot_all_df_columns(df2)
fig.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 18:57:05