PandasAI:用自然语言对话式清洗数据的实战指南

发布时间:2026/7/13 7:07:04
PandasAI:用自然语言对话式清洗数据的实战指南 1. 项目概述用自然语言“对话式清洗”数据不是魔法是工具链的合理延伸你有没有过这样的经历刚拿到一份新数据集第一反应不是兴奋而是叹气打开 CSV 文件发现缺失值像撒了盐一样随机分布列名是col_123和user_input_v2_final_revised这种让人头皮发麻的组合日期格式在同一个字段里混着2023-01-01、01/01/2023甚至Jan 1st, 2023三种写法。这时候你本能地打开 Jupyter Notebook开始敲df.info()、df.describe()、df.isnull().sum()再手写一堆fillna()、str.replace()、pd.to_datetime()……整个过程枯燥、重复、极易出错而且每次换一个数据集这套流程就得重来一遍。这就是传统数据探索与清洗EDA Data Cleaning的真实日常——它不是技术瓶颈而是时间与耐心的消耗战。而这篇博文要聊的正是如何把这场消耗战变成一次高效的“对话”。核心关键词PandasAI它不是一个替代 Pandas 的新库而是一个聪明的“翻译官”和“执行助手”。它架设在你熟悉的pandas.DataFrame之上让你能用纯自然语言比如“把所有空值替换成该列的中位数”、“把date列统一转成 YYYY-MM-DD 格式”、“找出salary列里明显异常的离群值”直接下达指令。它背后调用的是大语言模型LLM但它的价值不在于 LLM 多强大而在于它把 LLM 的“理解力”精准地锚定在了 Pandas 这个最成熟、最稳定的数据处理生态里。它解决的不是“能不能做”而是“要不要手动写一百行代码去试错”。它适合三类人一是刚入门 Python 数据分析的新手想绕过语法门槛快速上手二是经验丰富的数据工程师或分析师想把重复性高的清洗任务自动化把精力留给更复杂的建模和业务洞察三是业务部门同事他们不懂代码但需要快速验证一个数据假设比如“上个月销售额最高的三个城市是哪些”现在只需要一句话就能得到答案。这不是让机器取代人而是把人从机械劳动中解放出来回归到思考“数据意味着什么”这个本质问题上。2. 核心设计思路为什么是 PandasAI而不是自己写个 LLM 调用脚本2.1 从“通用问答”到“领域专用代理”的关键跃迁很多人第一次听说 PandasAI第一反应是“这不就是用 ChatGPT 写 Pandas 代码吗我自己也能问啊。” 这个想法非常对也恰恰点出了 PandasAI 最核心的设计哲学——它不是在做一个更强大的 ChatGPT而是在做一个更懂 Pandas 的“领域专用代理”Domain-Specific Agent。你可以把它想象成一个精通 Pandas 所有 API、所有坑、所有最佳实践的资深同事他坐在你旁边你只需要用日常语言描述你的需求他就能立刻写出最稳妥、最符合当前数据上下文的代码并且自动执行。为什么自己写个 LLM 调用脚本不行我试过踩过坑。最典型的失败场景是你问 LLM “帮我清洗数据”它可能给你返回一段华丽的、语法正确的 Python 代码但这段代码完全没考虑你的数据实际长什么样。比如它建议你用df.dropna()删除所有含空值的行可你的业务逻辑明明要求保留这些行只填充特定列或者它建议你用df[age].astype(int)强制转换却没检查age列里是否混着N/A或Unknown这样的字符串结果运行就报ValueError。这就是通用 LLM 的“知识幻觉”——它知道“应该怎么做”但不知道“在你的具体情境下什么才是安全的、可行的”。PandasAI 的解决方案非常务实它强制 LLM 的输出必须是一个可执行的、经过严格校验的 Pandas 操作。它内置了一个“沙盒”环境在真正修改你的原始 DataFrame 之前会先将 LLM 生成的代码在一个副本上运行并捕获所有可能的异常KeyError,TypeError,ValueError。如果出错了它不会报错退出而是会把错误信息“翻译”回自然语言再反馈给 LLM让它重新思考、重新生成。这个“生成-执行-校验-反馈”的闭环就是它区别于普通提示词工程的核心。它把 LLM 从一个“代码生成器”变成了一个“可信赖的执行伙伴”。2.2 架构分层三层协同缺一不可PandasAI 的内部架构可以清晰地拆解为三个紧密咬合的层次理解这个结构是掌握其使用精髓的前提。第一层数据感知层Data Awareness Layer这是 PandasAI 的“眼睛”和“耳朵”。当你把一个DataFrame传给它时它做的第一件事不是去问 LLM而是对这个数据进行一次深度“体检”。它会自动收集并结构化以下信息基础元数据列名、数据类型dtype、非空值数量、内存占用。统计摘要对于数值列计算min,max,mean,std,25%,50%,75%分位数对于类别列统计unique值的数量和前几个最常见的值。模式识别扫描文本列识别潜在的日期格式、邮箱、URL、电话号码等扫描数值列初步标记可能的离群值基于 IQR 方法。关系推断分析列与列之间的相关性皮尔逊/斯皮尔曼以及是否存在明显的主键/外键关系通过唯一值比例和值重叠度。这些信息会被整理成一份极其详尽的“数据报告”作为上下文的一部分连同你的自然语言提问一起喂给 LLM。这确保了 LLM 的每一次回答都是基于对这份数据的“亲眼所见”而非凭空猜测。第二层智能编译层Intelligent Compiler Layer这是 PandasAI 的“大脑”和“翻译中枢”。它接收来自第一层的结构化数据报告和你的提问然后扮演一个极其严格的“Prompt 工程师”。它不会把你的原话直接丢给 LLM而是会进行一系列精妙的预处理意图解析判断你的提问属于哪一类操作。是“探索性查询”如“sales列的平均值是多少”还是“转换性操作”如“把price列的单位从美元换成欧元”或是“清洗性操作”如“删除所有重复行”。不同类型的提问会触发不同的 Prompt 模板。约束注入根据数据报告自动注入硬性约束。例如如果检测到date列的数据类型是object它就会在 Prompt 中明确告诉 LLM“注意date列当前是字符串类型你需要先用pd.to_datetime()转换再进行后续操作。”安全护栏设置严格的“禁止项”。任何可能导致数据永久性、不可逆破坏的操作如del df[column]、df df.iloc[0:10]这种赋值都会被编译层直接拦截并拒绝执行。它只允许“函数式”的、可追溯的、可撤销的操作比如df.fillna()、df.astype()、df.assign()。第三层安全执行层Safe Execution Layer这是 PandasAI 的“双手”和“保险丝”。它负责将编译层输出的、经过重重校验的代码安全地应用到你的数据上。它的核心机制是“影子执行”Shadow Execution创建原始DataFrame的一个深层副本df_copy df.copy(deepTrue)。在这个副本上执行生成的代码。捕获所有输出print语句、返回值和所有异常。如果执行成功它会将副本的最终状态与原始状态进行对比计算出一个“变更摘要”Changed Columns:[price, date], Rows Affected:1245并询问你是否确认应用。只有在你明确输入y或yes后它才会将变更同步回原始DataFrame。这个三层架构共同构成了 PandasAI 的护城河。它不是在炫技而是在每一个环节都植入了对数据科学工作流的深刻理解和敬畏。它承认 LLM 会犯错所以用数据感知来约束它它承认人类会疏忽所以用安全执行来保护你。这种设计思路比单纯追求“生成代码多快多准”要务实和可靠得多。3. 实操细节解析从零开始构建你的第一个“对话式清洗工作流”3.1 环境准备与依赖安装选对版本事半功倍在动手之前我们必须面对一个现实PandasAI 并不是一个“装完就能用”的玩具。它的稳定性和功能高度依赖于底层 LLM 的选择和配置。我强烈建议不要一上来就尝试最前沿、最昂贵的模型而是从一个稳定、免费、且社区支持最好的起点开始。我的实测推荐组合是PandasAI v1.2.1 Google Gemini Pro (viagoogle-generativeai)。原因如下Gemini Pro 的免费额度足够日常使用Google Cloud Platform 为新用户提供 $300 的初始信用额度而 Gemini Pro 的 API 调用成本极低约 $0.00025 / 1000 tokens这意味着你完全可以免费使用数月足够完成所有学习和大部分项目。它对代码的理解能力远超同级开源模型相比 Llama 3 或 Phi-3Gemini Pro 在理解 Pandas API 的细微差别比如inplaceTrue的副作用、assign()与直接赋值的区别上表现得更加稳健生成的代码错误率更低。官方 SDK 集成度高配置简单google-generativeai库的文档清晰认证流程只需一个GOOGLE_API_KEY环境变量比 OpenAI 的openai库更简洁没有复杂的base_url或api_version需要折腾。安装步骤如下我建议在一个全新的虚拟环境中操作避免依赖冲突# 1. 创建并激活虚拟环境推荐使用 conda因为它对数据科学包的管理更友好 conda create -n pandasai_env python3.10 conda activate pandasai_env # 2. 安装核心依赖 pip install pandas numpy matplotlib seaborn # 3. 安装 PandasAI 及其官方推荐的 LLM 适配器 pip install pandasai google-generativeai # 4. 可选但强烈推荐安装一个轻量级的本地 LLM 作为备用方案 # 这样当网络不稳定或 API 配额用尽时你仍有退路 pip install llama-cpp-python提示如果你坚持使用 OpenAI 的 GPT 模型请务必安装openai1.0.0。旧版本的openai库v0.x与 PandasAI v1.x 不兼容会导致AttributeError: module openai has no attribute ChatCompletion这类经典错误。这是一个新手最容易栽跟头的地方我第一次就在这里卡了整整一个下午。安装完成后最关键的一步是获取你的 API Key。对于 Gemini你需要访问 Google AI Studio 。登录你的 Google 账号。在左侧菜单点击 “Get API Key”然后点击 “Create new API key”。将生成的密钥复制下来。然后在你的 Python 脚本或 Jupyter Notebook 的最开头添加以下两行import os os.environ[GOOGLE_API_KEY] your_actual_api_key_here请务必把your_actual_api_key_here替换成你从 Google AI Studio 复制的密钥。切记永远不要把这个密钥硬编码在会提交到 GitHub 的代码文件里正确的做法是把它放在一个.env文件中然后用python-dotenv库来加载。这是数据工程师的基本职业素养。3.2 数据准备构造一个“有代表性”的测试数据集为了让你能立刻看到效果我们不拿网上那些千篇一律的titanic.csv或iris.csv来演示。我们要构造一个更贴近真实业务场景的、充满“脏乱差”元素的数据集。下面这段代码我会生成一个模拟的电商用户行为日志它包含了几乎所有常见的数据质量问题import pandas as pd import numpy as np from datetime import datetime, timedelta import random # 设置随机种子保证结果可复现 np.random.seed(42) random.seed(42) # 生成 1000 行模拟数据 n_rows 1000 # 用户ID混合了数字和字母还有少量拼写错误 user_ids [fU{random.randint(100, 999)} for _ in range(n_rows)] # 故意加入一些错误U123A, U456B, U789C for i in random.sample(range(n_rows), 20): user_ids[i] random.choice([A, B, C]) # 时间戳混合了多种格式 timestamps [] base_time datetime(2023, 1, 1) for _ in range(n_rows): # 大部分是标准格式 if random.random() 0.2: ts base_time timedelta(daysrandom.randint(0, 365)) timestamps.append(ts.strftime(%Y-%m-%d %H:%M:%S)) # 20% 是美式格式 else: ts base_time timedelta(daysrandom.randint(0, 365)) timestamps.append(ts.strftime(%m/%d/%Y %I:%M %p)) # 商品价格有缺失值、有异常值比如 0.01 美元的“幽灵商品” prices np.random.lognormal(mean8, sigma1.5, sizen_rows) # 加入 5% 的缺失值 missing_mask np.random.random(n_rows) 0.05 prices[missing_mask] np.nan # 加入 2% 的异常低价 outlier_mask np.random.random(n_rows) 0.02 prices[outlier_mask] np.random.uniform(0.01, 0.99, sizeoutlier_mask.sum()) # 用户评分有字符串、有负数、有超出范围的值 ratings np.random.normal(loc4.0, scale0.8, sizen_rows) # 加入 3% 的字符串 for i in random.sample(range(n_rows), int(n_rows * 0.03)): ratings[i] random.choice([N/A, Not Rated, NULL]) # 加入 1% 的负数和超大值 for i in random.sample(range(n_rows), int(n_rows * 0.01)): ratings[i] random.choice([-5.0, 15.0, 100.0]) # 创建 DataFrame df pd.DataFrame({ user_id: user_ids, timestamp: timestamps, product_price: prices, user_rating: ratings }) # 保存为 CSV方便后续反复加载 df.to_csv(ecommerce_dirty.csv, indexFalse) print(模拟脏数据集 ecommerce_dirty.csv 已生成) print(f数据形状: {df.shape}) print(df.head())运行这段代码后你会得到一个名为ecommerce_dirty.csv的文件。用df.info()查看你会发现user_id列是object类型但里面混着U123A这样的“脏”ID。timestamp列也是object因为格式不统一无法直接用pd.to_datetime()解析。product_price列有float64类型但包含大量NaN和异常的低价。user_rating列更是“重灾区”类型是object里面既有数字又有字符串还有非法数值。这个数据集就是我们接下来所有“对话式清洗”的战场。它不完美但足够真实。3.3 核心操作用自然语言驱动数据清洗的完整流程现在我们进入最激动人心的部分——用说话的方式让数据变得干净。请打开一个新的 Jupyter Notebook按顺序执行以下步骤。第一步初始化 PandasAI Agentfrom pandasai import SmartDataframe from pandasai.llm import GoogleGenerativeAI # 初始化 LLM llm GoogleGenerativeAI(api_keyos.getenv(GOOGLE_API_KEY)) # 将你的 DataFrame 包装成一个“智能”的 DataFrame # 注意这里传入的是原始的、未清洗的 df smart_df SmartDataframe(df, config{llm: llm})这行SmartDataframe(df, ...)是整个魔法的开关。它会自动触发前面提到的“数据感知层”对df进行一次全面扫描并将结果缓存起来。这个过程可能需要几秒钟取决于数据量大小。请耐心等待它是在为你后续的每一次提问建立一个坚实的知识基础。第二步进行一次“探索性对话”建立信任在正式清洗之前先问一个简单、安全的问题来测试整个链路是否通畅并观察 PandasAI 的“思考过程”。# 提问告诉我关于这个数据集的基本情况 response smart_df.chat(这个数据集有多少行多少列每列的数据类型是什么) print(response)你可能会看到类似这样的输出“这个数据集共有 1000 行和 4 列。各列的数据类型如下user_id是 object 类型timestamp是 object 类型product_price是 float64 类型user_rating是 object 类型。其中product_price列有 50 个缺失值NaNuser_rating列有 30 个缺失值另外还包含一些非数字的字符串值如 N/A。”这个回答的价值不在于它告诉你了什么而在于它向你证明了PandasAI 确实“看懂”了你的数据。它没有泛泛而谈而是给出了精确的数字50 个、30 个并指出了user_rating列的特殊性“非数字的字符串值”。这建立了你对它的初步信任。第三步执行核心清洗操作——一场真实的“对话”现在让我们进入正题。我们将用一系列自然语言指令完成一个完整的清洗流水线。请记住每一次提问都是一个独立的、原子化的操作。指令 1标准化用户 IDresponse smart_df.chat(请把 user_id 列中所有以 A, B, C 结尾的 ID都去掉最后一位字符。例如U123A 变成 U123。) print(response)PandasAI 的思考过程它会先检查user_id列的样本确认确实存在U123A这样的模式然后生成df[user_id] df[user_id].str.slice(0, -1)这样的代码并在沙盒中执行。它会告诉你共修改了 20 行数据。指令 2统一时间戳格式response smart_df.chat(请把 timestamp 列的所有值都转换成标准的 YYYY-MM-DD HH:MM:SS 格式。对于无法解析的值请设为 NaT。) print(response)PandasAI 的思考过程这是最考验它能力的一步。它会尝试多种pd.to_datetime()的参数组合formatauto,infer_datetime_formatTrue,errorscoerce直到找到一个能最大程度成功解析的方案。它会告诉你成功解析了 980 行有 20 行被设为NaT。指令 3清洗价格列response smart_df.chat(请用 product_price 列的中位数来填充该列的所有缺失值NaN。然后把所有小于 1.0 的价格值都视为异常值并用该列的均值替换它们。) print(response)PandasAI 的思考过程它会先计算中位数和均值然后生成两行代码df[product_price].fillna(df[product_price].median(), inplaceTrue)和df.loc[df[product_price] 1.0, product_price] df[product_price].mean()。它会精确地告诉你填充了 50 个 NaN替换了 20 个异常值。指令 4清洗评分列response smart_df.chat(请把 user_rating 列中所有非数字的值如 N/A, Not Rated都转换为 NaN。然后把所有小于 0 或大于 5 的数值都视为无效评分并用该列的中位数替换它们。) print(response)PandasAI 的思考过程它会使用pd.to_numeric(..., errorscoerce)来安全地转换再用布尔索引进行条件替换。它会给出一个清晰的变更摘要。第四步验证成果一键导出所有清洗指令执行完毕后别急着庆祝。用最朴素的方法验证结果# 查看清洗后的数据概览 print(smart_df.data.head()) print(\n清洗后的数据信息) print(smart_df.data.info()) # 导出为新的 CSV 文件 smart_df.data.to_csv(ecommerce_clean.csv, indexFalse) print(\n✅ 清洗完成干净的数据已保存为 ecommerce_clean.csv)你会发现user_id列现在全是U123这样的标准格式timestamp列已经变成了datetime64[ns]类型product_price和user_rating列都变成了干净的float64且不再有非法值。整个过程你没有写一行 Pandas 代码只是在和一个“懂行”的同事聊天。4. 实操过程与核心环节实现深入代码层理解它如何“思考”4.1 Prompt 工程的实战剖析它到底在给 LLM 说什么很多读者会好奇PandasAI 究竟用了什么样的 Prompt才能让 LLM 如此听话我们可以“偷看”一下它内部生成的 Prompt。虽然 PandasAI 的源码是开源的但直接阅读源码太费劲。一个更直观的方法是利用它的last_prompt属性在SmartDataframe对象上调用来查看上一次发送给 LLM 的完整消息。在你执行完smart_df.chat(把user_id列...)之后立即运行print(smart_df.last_prompt)你会看到一段非常长的、结构化的文本。它大致分为以下几个区块1. 系统角色设定System MessageYou are a helpful data science assistant. You are working with a pandas DataFrame named df. Your goal is to generate valid, safe, and efficient Python code to answer the users question. You must only use pandas and numpy libraries. Do not use any other libraries. You must never modify the original DataFrame directly. Always work on a copy. ...这是给 LLM 的“宪法”明确了它的身份、权限和绝对红线。2. 数据上下文Data ContextThe DataFrame has 1000 rows and 4 columns. Column user_id: - dtype: object - Sample values: [U123, U456A, U789B, U234, U567C] - Unique count: 980 ...这是前面提到的“数据感知层”的输出。它不是简单地 dump 出所有数据而是进行了高度的摘要和提炼只保留对当前任务最有价值的信息。比如它特意列出了user_id的样本值就是为了让你的提问“去掉结尾的 A/B/C”能够被精准匹配。3. 用户提问User MessagePlease remove the last character from all user_id values that end with A, B, or C. For example, U123A should become U123.这是你输入的原始提问一字未改。4. 代码生成指令Code Generation InstructionGenerate ONLY the Python code to perform this operation. Do not include any explanations, comments, or print statements. The code must be executable and safe. It should use pandas methods like .str.slice(), .str.replace(), etc. Return the code inside a markdown code block with the language python.这是最关键的“咒语”。它用极其强硬的措辞ONLY,MUST,NO来约束 LLM 的输出格式确保它只吐出纯净的、可执行的代码块。这个 Prompt 的设计堪称工业级 Prompt Engineering 的典范。它没有追求“优雅”或“文学性”而是用最直白、最不容置疑的语言为 LLM 划定了一个清晰、狭窄、但绝对安全的行动边界。这正是 PandasAI 能够落地的根本原因——它把一个开放、混沌的“通用智能”问题转化成了一个封闭、确定的“代码生成”问题。4.2 参数调优如何让 PandasAI 更“懂你”的小技巧PandasAI 的config参数就像汽车的驾驶模式有“经济”、“运动”、“舒适”等多种选择。默认配置config{}适用于大多数场景但当你遇到复杂问题时微调几个关键参数效果立竿见影。enable_cache开启/关闭结果缓存smart_df SmartDataframe(df, config{ llm: llm, enable_cache: True # 默认为 True })这个参数控制 PandasAI 是否会将你之前的提问和对应的代码结果缓存起来。好处是如果你问了两次“product_price的均值是多少”第二次会秒回因为它直接从缓存里读取了上次的计算结果。坏处是如果你在中间手动修改了df缓存的结果就可能过期。我的建议是在探索阶段频繁提问保持开启在清洗阶段准备导出最终结果可以设为False确保每一次响应都是基于最新的数据状态。max_retries设置最大重试次数smart_df SmartDataframe(df, config{ llm: llm, max_retries: 3 # 默认为 3 })当 LLM 生成的代码执行失败时PandasAI 会自动重试。max_retries就是它愿意重试的次数上限。设得太低如 1它可能在第一次失败后就放弃给你一个错误信息设得太高如 10它可能会陷入一个无意义的循环浪费 API 调用和时间。3是一个经过大量实测的黄金值它给了 LLM 足够的修正机会又不会无限拖延。custom_prompts注入你的领域知识高级技巧这是最强大的功能但也最难驾驭。它允许你为特定类型的提问提供一个完全自定义的 Prompt 模板。例如你的业务中“销售额”永远是指revenue_usd列而“用户活跃度”永远是指login_count列。你可以这样定义from pandasai.prompts import GeneratePythonCodePrompt my_custom_prompt You are an expert analyst for an e-commerce company. When the user mentions revenue, you must always refer to the column revenue_usd. When the user mentions active users, you must always refer to the column login_count. ... # 创建一个自定义的 Prompt 对象 prompt GeneratePythonCodePrompt(custom_promptmy_custom_prompt) smart_df SmartDataframe(df, config{ llm: llm, custom_prompts: {generate_python_code: prompt} })这相当于给 PandasAI 安装了一个“业务词典”让它在理解你的提问时能自动进行一次领域术语的映射。这对于团队协作和长期项目维护来说价值巨大。5. 常见问题与排查技巧实录那些官方文档里不会写的“血泪教训”5.1 典型问题速查表问题现象可能原因排查与解决方法ModuleNotFoundError: No module named pandasaiPandasAI 未正确安装或安装在了错误的 Python 环境中。1. 运行which python或where python确认当前终端使用的 Python 路径。2. 运行python -m pip list | grep pandasai检查是否在该环境中安装了 PandasAI。3. 如果没有用python -m pip install pandasai重新安装。google.generativeai.types.generation_types.BlockedPromptException你发送的提问被 Google 的内容安全策略拦截了。这通常发生在提问中包含了敏感词汇如“密码”、“身份证”、“银行账户”或过于模糊的指令如“帮我做所有事情”。解决方法将提问拆解得更具体、更技术化。例如把“保护用户隐私”改成“把email列的所有值都用 SHA-256 哈希后截取前 10 位”。ValueError: cannot convert float NaN to integerLLM 生成的代码试图对一个包含 NaN 的列进行astype(int)操作。这是 Pandas 的经典陷阱。Pandas 不允许将 NaN 直接转为整数。解决方法在提问时明确加上“先用fillna(0)填充缺失值再转为整数”。或者更推荐的做法是让 LLM 使用astype(Int64)注意是大写的I这是 Pandas 的可空整数类型。Response is empty or invalidLLM 返回的响应格式不符合 PandasAI 的预期可能是一段纯文本解释而不是代码块。这通常是因为你使用的 LLM 模型太弱如一个 3B 的本地小模型无法理解 PandasAI 的严格 Prompt 指令。解决方法立即切换到更强大的模型如 Gemini Pro 或 GPT-4。不要在模型能力上妥协。5.2 我踩过的坑与独家避坑技巧坑一“一步到位”的妄想症我最初的想法是写一个超级长的提问“请帮我完成以下所有清洗步骤1. 标准化user_id2. 统一timestamp3. 填充price的缺失值4. ……” 结果PandasAI 直接崩溃了或者生成了一段极其冗长、难以调试的代码。教训PandasAI 的设计哲学是“原子化”。它最擅长处理单一、明确、聚焦的任务。把一个复杂的清洗流水线拆解成 5-10 个独立的小指令不仅成功率更高而且每一步你都能看到清晰的变更摘要便于审计和回滚。这就像一个优秀的项目经理永远不会给下属一个模糊的“把项目做完”而是会分解成一个个具体的、可验收的里程碑。坑二对“执行”二字的误解有一次我问“user_rating列的平均值是多少”PandasAI 回答“4.21”。我心想这不就是我要的答案吗但当我回头去看df发现user_rating列还是乱七八糟的object类型。真相PandasAI 的chat()方法有两种模式。当你的提问是一个“查询”query时它只返回结果不修改数据当你的提问是一个“指令”command时它才会生成并执行代码。区分的关键在于动词。“What is the mean of...?”是查询“Calculate the mean of... and store it in a new column”是指令。如果你想让结果“落地”提问时一定要用祈使句包含明确的动作动词fill,convert,drop,create,assign。坑三忽略“数据快照”的重要性在一次重要的客户演示中我用 PandasAI 清洗完数据导出 CSV客户说“这个user_id还是不对啊。” 我当场懵了。后来才发现我在清洗过程中不小心在另一个 notebook cell 里手动运行了df df.drop_duplicates()这直接修改了原始的df而SmartDataframe对象内部的data属性却还指向着那个已经被污染的副本。终极解决方案永远遵循“单源真理”原则。在你的工作流最开始就创建一个df_original df.copy()。所有的清洗操作都只对df_original进行。SmartDataframe只是用来和你“对话”的接口它内部的状态你不应该去关心也不应该去依赖。清洗完成后直接用smart_df.data这是它内部维护的、最新、最干净的副本来导出结果。这才是最安全、最可复现的工作方式。6. 总结与个人体会它不是终点而是你数据工作流的“新起点”写到这里我想分享一点我个人的体会。PandasAI 绝对不是什么“银弹”它不会让你一夜之间成为数据科学家。它最大的价值不在于它能帮你省下多少行代码而在于它彻底改变了你与数据建立连接的方式。过去我们和数据的对话是通过键盘、通过语法、通过一次又一次的print()和head()来完成的这个过程是单向的、滞涩的。而现在PandasAI 让这个对话变成了双向的、即时的、甚至是带点温度的。你可以问它“这个异常值看起来很奇怪你觉得它可能是录入错误还是真实的业务事件