PandasAI:用自然语言操作 DataFrame 的库

FreeGuideOnline 最新 2026-06-23

什么是 PandasAI

PandasAI 是一个将自然语言处理与 Pandas 结合的开源库。它允许你使用日常英语(或其他语言)直接向 DataFrame 提问,而无需编写复杂的过滤、聚合或绘图代码。PandasAI 在底层借助大型语言模型(LLM)将自然语言转换为 Python 代码,在本地执行后返回结果,让数据分析变得像聊天一样简单。

为什么选择 PandasAI

  • 零代码分析:无需记忆 Pandas 语法,适合非技术用户或快速探索数据。
  • 保留原始数据:所有计算在本地完成,数据不会上传至第三方服务器(使用本地模型时)。
  • 支持可视化:可以直接要求生成图表,PandasAI 会返回 Matplotlib 或 Seaborn 图像。
  • 兼容多种数据源:除 DataFrame 外,还支持 CSV、Excel、SQL 数据库等多种格式。

环境准备与安装

安装 PandasAI 库

推荐在虚拟环境中通过 pip 安装:

pip install pandasai

如果你希望使用本地模型(如 Llama、Mistral),可以安装对应的后端扩展:

pip install pandasai[local]
pip install pandasai[ollama]   # 例如使用 Ollama 本地服务

配置 API 密钥(使用云端 LLM)

PandasAI 默认使用 OpenAI 模型,你需要设置 API 密钥。可以通过环境变量或代码直接配置:

import os
os.environ["OPENAI_API_KEY"] = "sk-..."

也可在初始化智能代理时传入 api_key 参数。如果使用其他平台(如 Azure OpenAI、Google PaLM),需要提供对应的凭证对象。

初始化 PandasAI 智能代理

所有操作围绕 SmartDataframeAgent 展开。最基本的方式:

from pandasai import SmartDataframe
import pandas as pd

df = pd.DataFrame({
    "国家": ["中国", "美国", "印度"],
    "人口(亿)": [14.1, 3.3, 14.2],
    "GDP(万亿美元)": [17.7, 25.0, 3.4]
})

sdf = SmartDataframe(df)

基础查询:像聊天一样分析数据

简单问答

直接使用 chat() 方法用自然语言提问:

response = sdf.chat("哪个国家人口最多?")
print(response)
# 输出:印度

可以进行数值计算:

sdf.chat("GDP 总和是多少?")
# 输出:46.1 万亿美元

条件过滤与排序:

sdf.chat("按 GDP 从高到低列出所有国家")
# 返回排序后的 DataFrame 表格

获取代码与解释

有时你想查看 PandasAI 生成的底层代码,可以设置 verbose=True 或使用 last_code 属性。

sdf = SmartDataframe(df, config={"verbose": True})
sdf.chat("人均 GDP 最高的国家")
# 控制台会输出生成的代码,如:
# df['人均GDP'] = df['GDP(万亿美元)'] / df['人口(亿)']
# df.sort_values('人均GDP', ascending=False).head(1)

也可以事后查询代码:

print(sdf.last_code_generated)

数据可视化

PandasAI 能够根据要求直接生成图表。只需用自然语言描述你想要的图形:

sdf.chat("绘制人口与 GDP 的散点图,用国家作为标签")

默认会生成一张 PNG 图片路径;在 Jupyter 环境下可以自动显示图像。

你也可以通过返回的路径将图片嵌入报告或网页。如需保存到指定位置,可以指定文件名:

response = sdf.chat("保存一张 GDP 柱状图,文件名为 gdp_bar.png")

可视化支持 Matplotlib 和 Seaborn,你可以要求调整样式、颜色等细节:

sdf.chat("绘制人口分布饼图,使用 seaborn 风格,并添加标题")

连接多种数据源

CSV 文件

无需先读取为 DataFrame,直接传入文件路径:

sdf = SmartDataframe("sales_data.csv")
sdf.chat("找出销售额最高的前 5 天")

Excel 文件

PandasAI 支持读取指定工作表:

sdf = SmartDataframe("report.xlsx", sheet_name="2024Q1")
sdf.chat("利润月度趋势如何?")

数据库(SQL)

通过连接器查询关系型数据库:

from pandasai import SmartDatalake
from pandasai.connectors import SQLConnector

connector = SQLConnector(
    config={
        "dialect": "mysql",
        "host": "localhost",
        "username": "root",
        "password": "pass",
        "database": "sales"
    },
    tables=["orders", "customers"]
)

lake = SmartDatalake(connector)
lake.chat("每个客户的总消费金额,并画出Top10柱状图")

注意:数据库操作仅在查询时返回样本数据,不会将整个表加载到内存。

高级功能与定制

使用本地模型保护隐私

如果你的数据敏感,可以使用完全本地部署的 LLM,例如通过 Ollama:

ollama pull llama3

然后在代码中指定本地模型:

from pandasai import SmartDataframe
from pandasai.llm.local_llm import LocalLLM

llm = LocalLLM(api_base="http://localhost:11434/v1", model="llama3")
sdf = SmartDataframe(df, config={"llm": llm})
sdf.chat("哪些产品的退货率超过5%?")

自定义提示与安全策略

你可以提供额外的上下文来约束回答格式或风格:

sdf = SmartDataframe(df, config={
    "custom_instructions": "用中文回答,并始终给出计算过程。"
})

为防止执行危险代码(如系统调用),PandasAI 内置了一个安全沙箱,但建议避免让 LLM 接触不受信任的输入。

处理大型数据集

PandasAI 本身并不改变 Pandas 的性能,但对于超大 DataFrame,你可以先对数据进行抽样,再用自然语言分析:

sample_df = df.sample(10000)
sdf = SmartDataframe(sample_df)
sdf.chat("这个样本中数值列的相关系数矩阵")

或者使用 SmartDatalake 配合数据库仅查询聚合结果,避免全量加载。

多 DataFrame 分析

SmartDatalake 允许同时加载多个 DataFrame 并进行跨表查询:

customers_df = pd.DataFrame(...)
orders_df = pd.DataFrame(...)

lake = SmartDatalake([customers_df, orders_df])
lake.chat("将订单与客户合并,计算每个城市的总销售额")

常见问题与技巧

如何确保回答准确

  • 提供清晰的列名和上下文,避免歧义(例如用“销售额(万元)”而不是“sale”)。
  • 对于复杂逻辑,可以先要求 PandasAI 解释它生成的代码,再人工审核。
  • 使用 verbose=True 查看每次生成的 Python 代码。

错误处理

如果查询遇到错误,PandasAI 会返回一个包含错误信息的字符串。你可以根据提示重新提问或检查数据格式。

缓存 LLM 响应

重复问题可能消耗 API 额度,可以开启简单的响应缓存:

from pandasai import SmartDataframe
sdf = SmartDataframe(df, config={"enable_cache": True})

总结

PandasAI 为数据分析师、业务人员以及学习 Pandas 的新手提供了一条快速通道。它不能完全替代手写代码,但在探索性数据分析、快速出图、报告草稿生成等场景下能显著提升效率。结合本地模型,甚至可以做到离线使用且不泄露数据。现在就可以用几行代码尝试:“我的数据里最有趣的现象是什么?”

更多高级用法和实时更新,请参考 PandasAI 官方文档