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

Streamlit multiselect:获取多选客户共有产品的实现方法

多客户共有产品筛选实现方案

整体逻辑分三步完成,可直接嵌入Streamlit应用流程:

  • 第一步:实现客户多选组件,获取用户选中的客户集合
    直接从DataFrame提取所有不重复客户作为多选选项,加空值判断避免未选客户时后续逻辑报错:
    import streamlit as st
    import pandas as pd
    
    # 加载你的原始DataFrame,此处替换为你的数据读取逻辑
    df = pd.DataFrame([
        ["A", "iphone", "11"],
        ["A", "ipad", "7"],
        ["B", "iphone", "11"],
        ["B", "ipad", "7"],
        ["B", "iMac", "2012"]
    ], columns=["customer", "product", "version"])
    
    selected_customers = st.multiselect(
        label="请选择要对比的客户",
        options=df["customer"].unique()
    )
    
  • 第二步:计算所有选中客户的共有产品,提供两种可直接复用的实现方式
    两种方式都能得到正确结果,可根据数据量选择:
    1. 分组统计法(适合数据量较大的场景,性能更好)
      核心逻辑:筛选出选中客户的所有记录后,按产品分组统计关联的去重客户数,关联客户数等于选中客户总数的产品,就是所有客户共有的产品:
    if not selected_customers:
        common_products = []
    else:
        customer_filtered = df[df["customer"].isin(selected_customers)]
        common_products = customer_filtered.groupby("product")["customer"]\
            .nunique()\
            .loc[lambda x: x == len(selected_customers)]\
            .index.tolist()
    
    1. 集合交集法(适合数据量较小的场景,逻辑直观易读)
      核心逻辑:提取每个选中客户对应的产品集合,对所有集合求交集,结果就是共有产品:
    if not selected_customers:
        common_products = []
    else:
        product_set_list = [
            set(df[df["customer"] == c]["product"].unique()) 
            for c in selected_customers
        ]
        common_products = list(set.intersection(*product_set_list))
    
    用提供的测试数据验证,同时选中A、B两个客户时,两种方法返回的结果都是['iphone', 'ipad'],和预期输出一致。
  • 第三步:将共有产品列表作为下游选择组件的数据源即可
    selected_common_product = st.selectbox(
        label="请选择共有产品",
        options=common_products
    )
    

注意:如果需要考虑版本维度的匹配(即同产品同版本才算共有),只需要把分组/集合统计的字段从product改成product和version的组合字段即可,逻辑完全通用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 10:18:19