常见原因是输入非DataFrame或列名异常;需确保df1、df2均为pandas.DataFrame,列名有效且无重复,单列提取用[[]]而非[],避免直接传入转置结果。

为什么 sweetviz.compare() 报错说“not iterable”
常见原因是传入的两个数据集里有列名重复、或其中一个是 pandas.Series 而非 DataFrame。Sweetviz 严格要求输入必须是两个 DataFrame,且列结构要可比(比如不能一个有 10 列,另一个只有索引列)。
- 检查类型:
type(df1)和type(df2)必须都是pandas.core.frame.DataFrame - 确保列名不为空或全为
None:df1.columns.tolist()应返回正常字符串列表 - 如果用
df[['col']]提取单列,它返回的是Series,得写成df[['col']].copy()或加一对方括号强制转DataFrame - 避免用
df.T后直接传入——转置后索引变列名,常导致列名含int或float,Sweetviz 不认
怎么让 sweetviz.compare() 快一点又不丢关键信息
Sweetviz 默认对所有数值列做分布拟合、对所有类别列算频率表,数据一过万行就明显卡顿。它不是为大数据设计的,而是快速探查小到中等规模(
- 提前采样:
df1_sample = df1.sample(n=5000, random_state=42),再传给sweetviz.compare() - 用
feat_cfg关掉耗时项:比如feat_cfg = sweetviz.FeatureConfig(skip="col_to_ignore"),或设force_num/force_cat显式指定类型,避免自动推断出错 - 别开
pairwise_analysis(默认"auto"),大数据下设为"off",否则会尝试算所有数值列两两相关性,O(n²) 级别爆炸 - 输出 HTML 文件体积大?加
layout="vertical"减少横向滚动,加载更稳
对比报告里 “Target” 列没高亮或根本没出现
sweetviz.compare() 不会自动识别哪列是目标变量;它只做无监督对比。所谓“Target” 是你手动指定的——这一步漏了,整个差异分析就失去焦点。
- 必须显式传
target_feat="is_churn"(假设你的标签列叫is_churn) - 该列必须在两个 DataFrame 中都存在,且 dtype 一致(比如不能一个存
True/False,另一个存1/0) - 如果目标列是字符串(如
"high"/"low"),确保没空格或隐藏字符:df1["target"].str.strip().nunique()检查真实类别数 - 指定后,报告里对应列会多出“Target Distribution”和“Predictive Power Score”两块,这才是对比的核心落点
生成的 HTML 打不开或样式错乱
不是代码问题,大概率是浏览器或路径惹的祸。Sweetviz 生成的是自包含 HTML(内联 CSS/JS),但依赖本地文件协议限制和编码一致性。
立即学习“Python免费学习笔记(深入)”;
- 别双击直接打开:用 Python 启一个最小服务器,比如
python -m http.server 8000,然后访问http://localhost:8000/report.html - 路径含中文或空格?重命名目录为纯英文,比如
./reports/,再调用report.show_html("reports/compare.html") - 用 VS Code 预览插件打开?部分插件不支持内联 JS,换 Chrome/Firefox 直接打开
- 报告里图表显示“Loading…”不动?关掉广告屏蔽插件(如 uBlock Origin),它可能误杀 Sweetviz 自带的 Plotly 脚本
target_feat 参数和输入类型校验——这两步省了,后面所有可视化都只是表面热闹。










