AI 实用 06|AI 处理表格与数据:从"帮我算一下"到可核对的公式
核心原则:给它"数据长什么样",而不是"数据本身"
最常见的错误是把整张表贴进去。几千行数据会:烧光上下文、让模型抓不住重点、还可能因为太长而截断。
正确做法是给"结构描述":
表名:销售明细
行数:约 12,000 行
字段:
- 订单号 order_id (文本,格式 ORD-六位数字)
- 下单时间 created_at (日期,格式 2026-11-08 14:32:00)
- 部门 dept (文本,取值:华东/华南/华北/西南,可能有空值)
- 金额 amount (数值,单位元,两位小数)
- 状态 status (文本,取值:pending/paid/refunded)
样例 3 行:
ORD-000123 | 2026-11-08 14:32:00 | 华东 | 1299.00 | paid
ORD-000124 | 2026-11-08 15:10:22 | 华南 | 350.50 | pending
ORD-000125 | 2026-11-09 09:01:45 | 华东 | 2990.00 | refunded
这段"结构 + 样例"信息量足够,而 token 消耗只有几百。AI 处理表格的能力,80% 取决于你描述得准不准。
场景一:Excel 公式
提示模板
我在 Excel 里有一张表,数据在 A1:F12000。
A=订单号 B=日期 C=部门 D=金额 E=状态 F=备注
目标:在 G2 开始,按部门汇总"已支付"的金额。
要求:
- 用 SUMIFS,不要用数组公式
- 结果按部门去重列出,部门名放在 I 列,合计放 J 列
- 说明公式含义,每个参数对应哪个区域
- 给出如果我新增数据行,需要怎么调整范围
它会给:
=SUMIFS($D$2:$D$12000, $C$2:$C$12000, $I2, $E$2:$E$12000, "paid")
一定要让它解释参数。这样你能自己判断"条件区域和求和区域的顺序有没有搞反"——这是 SUMIFS 最常见的错误。
三类公式,需求要分开说
| 你要的 | 提示里该写 |
|---|---|
| 条件汇总 | "用 SUMIFS,条件有 2 个:部门 + 状态" |
| 跨表匹配 | "用 XLOOKUP(不是 VLOOKUP),找不到时返回 '未匹配'" |
| 动态筛选 | "用 FILTER(Office 365 动态数组),返回整行" |
明确指定函数版本很关键。你要 XLOOKUP,它却给了 INDEX+MATCH,虽然能用但维护起来累。
一个实用的追问
如果 C 列有空白单元格,上面的公式会怎么表现?会算进"空部门"吗?
给出处理办法。
AI 通常不会主动考虑空值。这一类追问,能提前发现 80% 的"数字对不上"问题。
场景二:SQL
提示模板
数据库:PostgreSQL 15
表结构:
orders(order_id text, created_at timestamptz, dept text, amount numeric(12,2), status text)
需求:统计 2026 年 10 月每个部门已支付订单的金额合计与订单数,
并按金额倒序。部门为空的行归入"未分配"。
要求:
- 用 CTE 结构,别写成三层嵌套
- 金额保留两位小数
- 说明时区处理方式
- 给出可能出现的性能问题
它会给出:
WITH base AS (
SELECT
COALESCE(NULLIF(TRIM(dept), ''), '未分配') AS dept,
amount
FROM orders
WHERE status = 'paid'
AND created_at >= '2026-10-01 00:00:00+08'
AND created_at < '2026-11-01 00:00:00+08'
)
SELECT dept,
COUNT(*) AS order_cnt,
ROUND(SUM(amount), 2) AS total_amount
FROM base
GROUP BY dept
ORDER BY total_amount DESC;
必须核对的三处:
- 时区。
timestamptz加时区偏移,否则统计范围会差 8 小时。 - 边界。用
>= 开始和< 下月 1 日,别用<= 月末(会漏掉或算进边界数据)。 - 方言。MySQL 的
LIMIT、SQL Server 的TOP、日期函数全不一样,提示里一定写明数据库。
让它自己审一遍
检查上面的 SQL:
- 有没有可能因为 NULL 导致分组丢失
- 有没有 index 用不上导致全表扫
- 如果 orders 有 5000 万行,这个查询要多久
场景三:Python 处理数据
用 pandas 处理一个 CSV(字段:order_id, created_at, dept, amount, status)。
任务:
1. 按 dept 汇总已支付订单的金额,空部门记为"未分配"
2. 计算每个部门 10 月环比 9 月的变化率,保留两位小数
3. 输出一个 Excel,两个 sheet:汇总、环比
约束:
- 完整可运行,不要省略
- 日期列先转 datetime,明确时区
- 金额用两位小数
- 注释只解释"为什么",不解释"是什么"
关键代码会类似:
import pandas as pd
df = pd.read_csv("sales.csv")
df["created_at"] = pd.to_datetime(df["created_at"])
df["dept"] = df["dept"].fillna("未分配").replace("", "未分配")
paid = df[df["status"] == "paid"].copy()
paid["month"] = paid["created_at"].dt.to_period("M")
monthly = (paid.groupby(["dept", "month"])["amount"]
.sum()
.round(2)
.unstack(fill_value=0))
ratio = ((monthly["2026-10"] - monthly["2026-09"]) / monthly["2026-09"])
ratio = ratio.replace([float("inf")], None).round(2)
这里有个必查点:inf。上月为 0 时,环比会算出无穷大或直接抛错。AI 有时会漏掉这个处理,一定要问一句"基期为 0 怎么办"。
场景四:透视表和图表的"设计"
AI 在"生成计算"上很强,在"判断该看什么"上其实也能用:
我有一张销售表(字段如上),老板要一份"月度经营分析",只看一页。
请给出:
1. 应该做哪 3 个核心指标(说明为什么选这三个)
2. 每个指标用什么图表(柱状/折线/饼图,说明理由)
3. 一张透视表的结构:行、列、值、筛选各放什么
不要给代码,先给方案。
这类"先问方案再要实现",能避免它直接给你一张花哨但没信息量的图。
怎么验证 AI 算得对不对
这是最容易跳过、也最致命的一步。三个交叉验证:
1. 总量对得上
筛选后的总金额 = 原始总金额 − 被排除部分
行数:筛选后 + 被排除 = 原始
任何"分组汇总",先算总数,再看分组之和是否等于总数。差一分钱都要查清楚。
2. 抽样核对 3 行
随机挑 3 个案例,手工算一遍。这一步能抓到 90% 的公式错误(尤其是条件顺序搞反的)。
3. 边界单独测
- 空值:
dept为空的行去哪了? - 零值:
amount = 0算不算进? - 重复:
order_id有没有重复,会不会重复计数? - 异常日期:有没有 2099 年这种脏数据?
常见坑,按出现频率排
| 坑 | 表现 | 对策 |
|---|---|---|
| 字段名对不上 | 它按猜的名字写公式 | 提示里贴真实表头 |
| 空值未处理 | 汇总少一块,且没人发现 | 显式问"空值怎么办" |
| 日期是文本 | 排序、筛选全乱 | 先isinstance / 看格式,转成真日期 |
| 金额精度 | 差几分钱 | 用numeric(12,2) 或整数分,别用浮点累加 |
| 时区 | 月度统计差 8 小时 | 明确+08 或转 UTC 再算 |
| 编码 | 中文乱码 | 读入时指定encoding='utf-8-sig' / gbk |
| 合并单元格 | 读数时缺行 | 先取消合并并填充 |
| 相对引用被拷错 | 公式下拉后错列 | 检查$ 绝对引用 |
关于隐私
表里有姓名、手机号、身份证、金额明细时,贴给 AI 之前先脱敏:
- 手机号 →
138****8000 - 姓名 →
张* - 身份证 → 前 6 位 +
********+ 后 4 位 - 内部编码 → 替换成
A001、A002
大多数分析任务不需要真实值,结构 + 样例 + 统计特征就够了。把这张表换成"字段 + 类型 + 3 行假数据",AI 一样能给你正确的公式和代码。
一句话方法
处理表格时,把 AI 当成"懂语法但不知道你数据长什么样的同事":你负责把结构说清楚,它负责把语法写对,最后你负责抽查核对。这三件事不要混在一起做。