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

如何将含列表列的DataFrame转为列表内容作行的Dash DataTable

问题根源

你的代码无法正常显示内容,核心是几个逻辑错误:

  • 原始数据结构和Dash DataTable的输入要求不匹配:原始数据是长表格式,每行对应单个App单周的记录,Top Users列存储3个用户的列表;但你定义的表格列是所有周的名称,直接把长表转成records格式返回,字段名和列ID完全不对应,表格无法匹配渲染。
  • 下拉框未设置默认值,页面首次加载时回调接收到的selected_app参数为None,直接做等值筛选会返回空数据集。
  • 布局顺序不合理,将结果表格放在了选择控件之前,不符合交互逻辑。
修正后可运行代码
import dash
from dash import dcc, html, dash_table, Input, Output
import pandas as pd

# 此处替换为你实际的数据源
top_users = pd.DataFrame([
    {"App": "App 1", "Week": "Week 1", "Top Users": ["1st user", "2nd user", "3rd user"]},
    {"App": "App 1", "Week": "Week 2", "Top Users": ["1st user", "2nd user", "3rd user"]},
    {"App": "App 1", "Week": "Week 3", "Top Users": ["1st user", "2nd user", "3rd user"]},
    {"App": "App 1", "Week": "Week 4", "Top Users": ["1st user", "2nd user", "3rd user"]},
])

# 保留原有的周格式处理逻辑
top_users['Week'] = pd.DatetimeIndex(top_users['Week']).strftime("%d/%m/%Y")
all_weeks = sorted(top_users['Week'].unique())
app_options = [{'label': str(app), 'value': app} for app in top_users['App'].unique()]
# 取第一个App作为下拉框默认选中值
default_selected = app_options[0]['value']

app = dash.Dash(__name__)

# 调整布局顺序:先放选择控件,再放表格,给下拉框绑定默认值
app.layout = html.Div(children=[
    dcc.Dropdown(id='app-picker', options=app_options, value=default_selected),
    dash_table.DataTable(
        id='top-users',
        columns=[{"name": i, "id": i} for i in all_weeks],
        fixed_rows={'headers': True},
        style_cell={'textAlign': 'left'}
    )                               
])

@app.callback(
    Output('top-users', 'data'),
    Input('app-picker', 'value')
)
def update_table(selected_app):
    if not selected_app:
        return []
    # 筛选当前选中App的所有周数据,转成 周:用户列表 的映射
    app_week_data = top_users[top_users['App'] == selected_app].set_index('Week')['Top Users'].to_dict()
    # 构造目标表格需要的3行数据(对应Top1/Top2/Top3)
    table_data = []
    for rank_idx in range(3):
        current_row = {}
        for week in all_weeks:
            # 取当前周对应排名的用户,缺失则填空占位符
            user_list = app_week_data.get(week, ["-", "-", "-"])
            current_row[week] = user_list[rank_idx]
        table_data.append(current_row)
    return table_data

if __name__ == '__main__':
    app.run_server(host="127.0.0.1", port=8060)
关键调整点
  • 给下拉框增加默认选中值,解决页面首次加载空参数的问题。
  • 重写回调内的数据转换逻辑:将筛选后的长表数据拆成3行,每行对应一个排名位,逐列填充对应周的用户,保证返回的数据字段和表格预定义的列ID完全匹配。
  • 增加空值兜底逻辑,当选中App缺失某周数据时不会抛出索引错误。
  • 调整布局顺序,将选择控件放在表格上方,符合常规交互路径。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 06:24:16