如何在Plotly Dash回调中正确调用Dataframe类整数格式列名
问题原因
最常见的诱因是Dash回调中DataFrame的列名类型和全局测试时不一致:
如果你是通过dcc.Store组件序列化传递DataFrame,反序列化后纯数字的列名(2018/2019等)会被默认转为整数类型,此时用字符串dfc['2018']索引自然匹配不到列;而City、TOTAL这类非数字列名类型不变,所以点式调用可以正常生效。
排查方法
在回调中读取dfc后先执行以下代码,确认列名类型:
print(dfc.columns.tolist()) print([type(col) for col in dfc.columns])
如果输出的2018等列的类型是<class 'int'>,即可确认是类型匹配问题。
修复方案
方案1:直接匹配类型调用
如果不想改列名,直接用整数作为索引调用即可:
dfc[2018] dfc[2019] # 以此类推
方案2:统一列名为字符串
在回调中读取dfc后先执行列名类型转换,之后就可以正常用dfc['2018']调用:
dfc.columns = dfc.columns.astype(str)
方案3:兼容点式调用
如果你想要和dfc.City一样用点式方法调用年份列,可以先给数字列加前缀重命名:
# 批量给纯数字列名加y_前缀 dfc = dfc.rename(columns=lambda x: f'y_{x}' if str(x).isdigit() else x) # 之后即可用点式调用 dfc.y_2018 dfc.y_2019
修正后的代码示例
以你提供的表格代码为例,统一列名后的完整写法如下:
# 回调内读取dfc后首先执行列名转换 dfc.columns = dfc.columns.astype(str) fig = go.Figure(data=[go.Table( header=dict(values=list(dfc.columns[1:]), fill_color='paleturquoise', align='left'), cells=dict(values=[dfc.City, dfc.TOTAL, dfc['2018'], dfc['2019'], dfc['2020'], dfc['2021']], fill_color='lavender', align='left')) ])
如果以上方案无效,检查回调内的dfc是否和全局测试用的dfc一致,是否存在过滤、合并操作导致年份列丢失,或dcc.Store存储时遗漏了对应列数据。
内容的提问来源于stack exchange,提问作者SoupriceCoder
相关产品推荐
相关产品推荐

