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

Streamlit运行报错:DataFrame中不存在'id_vars'指定的['index']

问题描述

本人是Pandas和Streamlit新手,出于个人兴趣编写了疫苗数据可视化脚本,代码如下:

import pandas as pd
import streamlit as st

st.title('Vaccine Overview')

@st.cache_data
def get_data():
    df = pd.read_csv('https://opendata.sozialversicherung.at/eimpfpass/COVID19_vaccination_agegroups_v202210.csv', sep=';')
    return df

df = get_data()

df_age_vacc = df.query('state_id == 11')\
    [['age_group','vaccine','vaccinations_administered_cumulative']]\
        .groupby(['age_group','vaccine'])['vaccinations_administered_cumulative']\
            .sum()

df_age_vacc.index.set_names(['Altersgruppe','Impfstoff'], inplace=True)
df_age_vacc.rename('Menge', inplace=True)

st.bar_chart(df_age_vacc)

运行脚本时出现错误:

KeyError: "The following 'id_vars' are not present in the DataFrame: ['index']"

df_age_vacc的索引信息如下:

In [70]: df_age_vacc.index
Out[70]: 
MultiIndex([(      '00-11',    'AstraZeneca'),
            (      '00-11', 'BioNTechPfizer'),
            (      '00-11',        'Janssen'),
            (      '00-11',        'Moderna'),
            (      '00-11',        'Novavax'),
            (      '00-11', 'Sanofi Pasteur'),
            (      '00-11',        'Valneva'),
            (      '12-14',    'AstraZeneca'),
            (      '12-14', 'BioNTechPfizer'),
            (      '12-14',        'Janssen'),
            (      '12-14',        'Moderna'),
            (      '12-14',        'Novavax'),
            (      '12-14', 'Sanofi Pasteur'),
            (      '12-14',        'Valneva'),
            (      '15-24',    'AstraZeneca'),
            (      '15-24', 'BioNTechPfizer'),
            (      '15-24',        'Janssen'),
            (      '15-24',        'Moderna'),
            (      '15-24',        'Novavax'),
            (      '15-24', 'Sanofi Pasteur'),
            (      '15-24',        'Valneva'),
            (      '25-34',    'AstraZeneca'),
            (      '25-34', 'BioNTechPfizer'),
            (      '25-34',        'Janssen'),
            (      '25-34',        'Moderna'),
            (      '25-34',        'Novavax'),
            (      '25-34', 'Sanofi Pasteur'),
            (      '25-34',        'Valneva'),
            (      '35-44',    'AstraZeneca'),
            (      '35-44', 'BioNTechPfizer'),
            (      '35-44',        'Janssen'),
            (      '35-44',        'Moderna'),
            (      '35-44',        'Novavax'),
            (      '35-44', 'Sanofi Pasteur'),
            (      '35-44',        'Valneva'),
            (      '45-54',    'AstraZeneca'),
            (      '45-54', 'BioNTechPfizer'),
            (      '45-54',        'Janssen'),
            (      '45-54',        'Moderna'),
            (      '45-54',        'Novavax'),
            (      '45-54', 'Sanofi Pasteur'),
            (      '45-54',        'Valneva'),
            (      '55-64',    'AstraZeneca'),
            (      '55-64', 'BioNTechPfizer'),
            (      '55-64',        'Janssen'),
            (      '55-64',        'Moderna'),
            (      '55-64',        'Novavax'),
            (      '55-64', 'Sanofi Pasteur'),
            (      '55-64',        'Valneva'),
            (      '65-74',    'AstraZeneca'),
            (      '65-74', 'BioNTechPfizer'),
            (      '65-74',        'Janssen'),
            (      '65-74',        'Moderna'),
            (      '65-74',        'Novavax'),
            (      '65-74', 'Sanofi Pasteur'),
            (      '65-74',        'Valneva'),
            (      '75-84',    'AstraZeneca'),
            (      '75-84', 'BioNTechPfizer'),
            (      '75-84',        'Janssen'),
            (      '75-84',        'Moderna'),
            (      '75-84',        'Novavax'),
            (      '75-84', 'Sanofi Pasteur'),
            (      '75-84',        'Valneva'),
            (        '85+',    'AstraZeneca'),
            (        '85+', 'BioNTechPfizer'),
            (        '85+',        'Janssen'),
            (        '85+',        'Moderna'),
            (        '85+',        'Novavax'),
            (        '85+', 'Sanofi Pasteur'),
            (        '85+',        'Valneva'),
            ('NotAssigned',    'AstraZeneca'),
            ('NotAssigned', 'BioNTechPfizer'),
            ('NotAssigned',        'Janssen'),
            ('NotAssigned',        'Moderna'),
            ('NotAssigned',        'Novavax'),
            ('NotAssigned', 'Sanofi Pasteur'),
            ('NotAssigned',        'Valneva')],
           names=['Altersgruppe', 'Impfstoff'])

In [71]: type(df_age_vacc)
Out[71]: pandas.core.series.Series
解决方案

错误原因是Streamlit的st.bar_chart在处理带有MultiIndex的Series时会出现解析问题,它无法正确识别MultiIndex作为分类维度。

可以通过以下两种方法解决:

  • 方法一:将现有Series转为DataFrame并重置索引
# 替换原来的st.bar_chart行
df_age_vacc_df = df_age_vacc.reset_index()
st.bar_chart(df_age_vacc_df, x='Altersgruppe', y='Menge', color='Impfstoff')
  • 方法二:分组时直接生成DataFrame(推荐,避免后续索引处理)
# 修改分组代码
df_age_vacc = df.query('state_id == 11')\
    [['age_group','vaccine','vaccinations_administered_cumulative']]\
        .groupby(['age_group','vaccine'], as_index=False)['vaccinations_administered_cumulative']\
            .sum()

# 重命名列
df_age_vacc.columns = ['Altersgruppe','Impfstoff','Menge']

st.bar_chart(df_age_vacc, x='Altersgruppe', y='Menge', color='Impfstoff')

两种方式都能让Streamlit正确识别数据维度,生成预期的柱状图。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 03:22:07