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() ) - 第二步:计算所有选中客户的共有产品,提供两种可直接复用的实现方式
两种方式都能得到正确结果,可根据数据量选择:- 分组统计法(适合数据量较大的场景,性能更好)
核心逻辑:筛选出选中客户的所有记录后,按产品分组统计关联的去重客户数,关联客户数等于选中客户总数的产品,就是所有客户共有的产品:
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()- 集合交集法(适合数据量较小的场景,逻辑直观易读)
核心逻辑:提取每个选中客户对应的产品集合,对所有集合求交集,结果就是共有产品:
用提供的测试数据验证,同时选中A、B两个客户时,两种方法返回的结果都是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))['iphone', 'ipad'],和预期输出一致。 - 分组统计法(适合数据量较大的场景,性能更好)
- 第三步:将共有产品列表作为下游选择组件的数据源即可
selected_common_product = st.selectbox( label="请选择共有产品", options=common_products )
注意:如果需要考虑版本维度的匹配(即同产品同版本才算共有),只需要把分组/集合统计的字段从
product改成product和version的组合字段即可,逻辑完全通用。
内容的提问来源于stack exchange,提问作者maxiteo
相关产品推荐
相关产品推荐

