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

Pandas中DataFrame列表类型列全选过滤isin报错问题求助

解决Product_Type全选时的筛选错误问题

错误原因分析

你遇到的only list-like objects are allowed to be passed to isin(), you passed a [str]错误,本质是:
当选择"Select All"时,list(file_data['Product_Type'].unique())返回的是列表的列表(比如[['Bag'], ['Bulk'], ['Bag', 'Bulk']]),而Pandas的isin()方法要求传入一维的、元素可哈希的可迭代对象(比如单个字符串的列表)。列表是不可哈希的,因此直接传入会触发错误。

另外,你原来的筛选逻辑对列表类型的列存在问题:file_data['Product_Type'].isin(product)是检查整个列表元素是否等于选中的产品值,而不是检查列表中是否包含该值,这可能和你实际想要的筛选效果不符。


解决方案

方法1:全选时跳过Product_Type筛选(最简洁)

当选择"Select All"时,直接让该筛选条件始终为True,既避免isin()的错误,又实现全选所有行的效果:

修改你的views.py代码如下:

if request.method == "POST":
    plant_code = request.POST.get("plant_code")
    destination_code = request.POST.get("destination_code")
    product = request.POST.get("product_type")
   
    # 处理Plant Code筛选
    if plant_code == 'all':
         plant_code = list(file_data['Route_Id'].unique())
    else:
         plant_code = plant_code.split("*")
    plant_filter = file_data['Route_Id'].isin(plant_code)
            
    # 处理Destination筛选
    if destination_code =='all':
         destination_code = list(file_data['Route_Id'].unique())
    else:
         destination_code = destination_code.split("*")
    destination_filter = file_data['Route_Id'].isin(destination_code)
            
    # 处理Product Type筛选
    if product =='all':
        # 全选时,保留所有行
        product_filter = pd.Series([True]*len(file_data), index=file_data.index)
    else:
        product_list = product.split("*")
        # 检查Product_Type列表中是否包含任意选中的产品类型
        product_filter = file_data['Product_Type'].apply(lambda x: any(p in x for p in product_list))

    # 组合筛选条件
    post_data = file_data[plant_filter & destination_filter & product_filter]

方法2:提取所有唯一产品类型值(按需使用)

如果你需要明确匹配包含所有现有产品类型的行(和方法1效果一致,因为所有行都至少包含一种产品类型),可以先提取所有Product_Type列表中的单个值再筛选:

if product =='all':
    # 提取所有Product_Type中的唯一值,组成一维列表
    all_products = set()
    for item in file_data['Product_Type']:
        all_products.update(item)
    product_list = list(all_products)
    product_filter = file_data['Product_Type'].apply(lambda x: any(p in x for p in product_list))
else:
    product_list = product.split("*")
    product_filter = file_data['Product_Type'].apply(lambda x: any(p in x for p in product_list))

关键说明

  • 替换isin()为apply(lambda x: any(...))是因为你的Product_Type列是列表类型,需要检查列表中是否包含选中的产品,而不是检查整个列表是否等于选中值。
  • 全选时直接使用True序列是最高效的方式,不需要额外处理数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 17:25:18