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
相关产品推荐
相关产品推荐

