From 3b7ac4a33626f8ead7819018ade02689d2fc7ffd Mon Sep 17 00:00:00 2001 From: Cxx0822 <1556464090@qq.com> Date: Tue, 14 Jul 2026 19:14:33 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=B7=A5=E5=85=B7=E6=96=B9?= =?UTF-8?q?=E6=B3=95=20=E5=A2=9E=E5=8A=A0list=E6=95=B0=E6=8D=AE=E5=85=BC?= =?UTF-8?q?=E5=AE=B9=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tools/base.py | 40 +++++++++++++++++++++++++++++++++++----- 1 file changed, 35 insertions(+), 5 deletions(-) diff --git a/tools/base.py b/tools/base.py index ec58f20..a972b72 100644 --- a/tools/base.py +++ b/tools/base.py @@ -1,3 +1,4 @@ +import numpy as np from langchain_core.tools import tool import requests import pandas as pd @@ -80,12 +81,21 @@ def filter_data(domain: str, filters: list[dict] | None = None, search: list[str continue col = df[field] + # 处理多值情况 - if col.apply(lambda x: isinstance(x, (list, tuple, set))).any(): - if op == "contains": + is_multi = col.apply(lambda x: isinstance(x, (list, tuple, set))).any() + + if is_multi: + if op == "eq": + col = col.apply(lambda x: value in x if isinstance(x, (list, tuple, set)) else False) + elif op == "ne": + col = col.apply(lambda x: value not in x if isinstance(x, (list, tuple, set)) else True) + elif op == "contains": col = col.apply(lambda x: value in x if isinstance(x, (list, tuple, set)) else False) elif op == "not_contains": col = col.apply(lambda x: value not in x if isinstance(x, (list, tuple, set)) else True) + else: + continue df = df[col] continue @@ -107,8 +117,17 @@ def filter_data(domain: str, filters: list[dict] | None = None, search: list[str for field in cfg.search_fields: if field not in df.columns: continue - # 如果包含就表示命中 - mask |= df[field].astype(str).str.contains(kw, na=False) + + # list 转成可检索的字符串 + col_str = df[field].apply( + lambda x: " ".join(map(str, x)) + if isinstance(x, (list, tuple, set)) + else str(x) + ) + + # 如果包含则命中 + mask |= col_str.str.contains(kw, na=False) + df = df[mask] filtered_len = len(df) @@ -193,8 +212,19 @@ def inspect_data(domain: str, sort_by: str | None = None, ascending: bool = Fals if fld not in row: continue val = row[fld] - if pd.isna(val) or val == "": + + # 数组 / Series + if isinstance(val, (np.ndarray, pd.Series)) or (isinstance(val, (list, tuple))): + if len(val) == 0: + val = "未填写" + else: + val = "、".join(map(str, val)) + elif pd.isna(val): val = "未填写" + elif val == "": + val = "未填写" + else: + val = str(val) lines.append(f"- {cfg.get_chinese_name(fld)}:{val}") print(f"[TOOL] inspect_data | rendered directly") return "\n".join(lines)