Plotly.express绘制饼图时如何剔除pandas数据中的NaN空值?
饼图空值问题解决方法
两种修改方式都可以实现剔除Null空值的需求,更建议调整初始DataFrame的转换逻辑,你当前使用pivot的方式本身不符合后续统计的需求。
问题根源
你当前执行df.pivot(columns='Month', values='Instrument')之后,得到的宽表结构中,每一行仅对应一个月份的乐器值,其余月份的单元格全部为NaN。所以Plotly统计对应月份的数值时,会把这些NaN也纳入统计,就出现了饼图中的Null占比。
你遇到的异常效果如下图:
推荐方案:调整DataFrame转换逻辑
删掉冗余的pivot转换步骤,直接基于原始长表数据按选中月份过滤统计,从根源避免空值产生。
修改后的完整代码如下:
import dash import dash_core_components as dcc import dash_html_components as html from dash.dependencies import Input, Output import plotly.express as px import pandas as pd df = pd.DataFrame([ ['January', 'Violin'], ['February', 'Piano'], ['March', 'Violin'], ['February', 'Violin'], ['January', 'Piano'], ['January', 'Violin']], columns=['Month', 'Instrument'] ) # 删掉原本的pivot转换代码,不需要转宽表 app = dash.Dash(__name__) app.layout = html.Div([ html.P("Select a month:"), dcc.Dropdown( id='my_dropdown', value = 'January', options=[ {'label': 'January', 'value': 'January'}, {'label': 'February', 'value': 'February'}, {'label': 'March', 'value': 'March'} ], clearable=False, style={"width": "50%"} ), dcc.Graph(id="pie-chart"), ]) @app.callback( Output("pie-chart", "figure"), [Input("my_dropdown", "value")]) def generate_chart(my_dropdown): # 先过滤对应月份的数据,自动排除其他月份的无关内容,无空值 filtered_df = df[df['Month'] == my_dropdown] fig = px.pie(filtered_df, names='Instrument') return fig app.run_server(debug=True)
可选方案:仅修改Plotly绘图代码
如果你要保留当前的pivot宽表结构,只需要在绘图时对选中列做空值剔除即可,将回调函数的代码修改为:
def generate_chart(my_dropdown): # 用dropna()删除选中列的空值后再绘图 fig = px.pie(df[my_dropdown].dropna(), names=my_dropdown) return fig
该方案仅做临时修复,宽表中大量冗余空值的问题依然存在,更推荐用第一种方案。
内容的提问来源于stack exchange,提问作者the_tc
相关产品推荐
相关产品推荐

