1. 先搞清楚Pandas绘图和Seaborn绘图分别解决什么问题
我在实际项目里见过太多人一上来就纠结“到底学Pandas绘图还是Seaborn”,其实这俩根本不是一个量级的东西。Pandas绘图是基于matplotlib封装的一套便捷接口,最大的价值在于——当你还在用DataFrame做数据清洗、聚合、筛选的时候,顺手就能画一张图看看数据长什么样,完全不用切换思维模式,也不需要额外导入别的库。它的定位是“探索性数据分析的快餐”,图能出来、趋势能看到、异常能发现,就够了。
Seaborn就不一样了,它的定位是“统计图形的高级定制”。同样是画一张散点图,Pandas给你的是基础版本,Seaborn可以在此基础上叠加回归拟合线、分面分组、类别色调映射、边缘分布图等等。尤其在做特征分析、模型报告、学术论文配图的时候,Seaborn的默认主题和配色方案几乎不需要额外调整就能达到投稿级别的要求。
所以我的建议很直接:日常快速看图用Pandas绘图,正式汇报、论文配图、复杂统计可视化用Seaborn。两者结合使用,才是在数据分析和机器学习项目中最高效的姿势。这篇博文我会先用一份真实的电影票房数据集,把两个库的核心绘图能力完整过一遍,再讲那些你在官方文档里很难找到的坑和技巧。
那个热词列表里出现了好几条“科研绘图”“城市规划与地理科研常用绘图skills”之类的搜索,说明现在很多人已经把可视化能力当作科研和职场的基础技能来要求了。这一点我很认同——图不是画得越花哨越好,而是越能准确传递信息越好。这恰恰是Pandas和Seaborn最擅长的事情。
我选的数据集是自己构造的2023年上半年国产电影票房样本,包含片名、类型、豆瓣评分、票房(亿)、观众数(万)五个字段。数据量不大,但我故意在里面埋了几个典型问题,比如缺失值、类型混乱、重复记录,这样在讲解绘图之前,可以顺带把数据清洗的操作也串一遍,让整个流程更接近真实工作场景。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 准备工作:环境安装和数据清洗是绘图之前最容易翻车的地方
2.1 Python环境与两个库的安装要点
先解决环境问题。热词里频繁出现“pycharm怎么安装pandas包”“python3.10与哪个pandas版本适配”,这类问题基本上是每个初学者都会卡住的点。实际上pandas和seaborn的安装没有想象中那么复杂,真正让人翻车的往往是Python版本和依赖包之间的兼容关系。
我自己现在用的是Python 3.10环境,对应的pandas版本建议2.0以上,seaborn建议0.12以上。如果你还在用Python 3.8或者更老的版本,那pandas最高只能装到1.5.x系列,很多新特性(比如copy_on_write机制、新的字符串数据类型)是用不了的。安装的时候直接在命令行执行就好:
bash复制pip install pandas seaborn matplotlib
如果网络状况不太理想,强烈建议换成国内镜像源,速度能快几十倍:
bash复制pip install pandas seaborn matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple
在PyCharm里安装就更简单了,打开File -> Settings -> Project -> Python Interpreter,点右上角的加号,搜索pandas和seaborn,选中后点击Install Package按钮就好。注意观察底部的Install to user's site packages directory选项,如果当前环境是系统级Python而不是虚拟环境,建议勾上这个,避免权限不足导致的安装失败。
有几个安装后立刻要做的验证操作:在Python交互式环境或PyCharm的Python Console里执行import pandas as pd和import seaborn as sns,如果没有任何报错,说明安装成功。我常看到有人安装完import的时候报错,说什么ModuleNotFoundError: No module named 'pandas',十有八九是安装到了A环境,但执行代码时用的是B环境。
2.2 准备一份带坑的数据集:从类型转换到重复值处理
数据是绘图的原料,原料不行,画出来的图再漂亮也是误导。我构造的这份电影数据里,有几个典型的脏数据问题,正好把热词里那个“pandas 数据类型转换”和“pandas drop”一起讲了。
原始数据大概是这样的格式:
| 片名 | 类型 | 豆瓣评分 | 票房 | 观众数 |
|---|---|---|---|---|
| 流浪地球2 | 科幻 | 8.3 | 40.29亿 | 7900万 |
| 满江红 | 悬疑 | 7.0 | 45.44亿 | 9200万 |
| 无名 | 谍战 | 6.9 | 9.31亿 | 1800万 |
| 深海 | 动画 | 7.3 | 9.19亿 | 2300万 |
| 保你平安 | 喜剧 | 7.7 | 10.00亿 | 2200万 |
| 铃芽之旅 | 动画 | 7.2 | 8.07亿 | 2100万 |
| 毒舌律师 | 剧情 | 7.5 | 3.71亿 | 760万 |
| 熊出没 | 动画 | 6.4 | 14.95亿 | 3400万 |
这里“票房”和“观众数”看起来是字符串,里面有“亿”和“万”这样的中文字符,直接丢给pandas做数值计算肯定报错。还有可能存在重复记录的问题,也就是热词里那条“pandas如果指定两列的值均相同,则取第一条数据即可”——这是个非常经典的去重场景。
第一步,先把票房列转换成统一的数值单位,我的习惯是全部转成“亿”为单位的浮点数:
python复制import pandas as pd
import numpy as np
df = pd.read_csv('movie_data.csv')
def convert_to_yi(value):
"""将'xx亿'或'xx万'格式的字符串统一转换为以'亿'为单位的浮点数"""
if isinstance(value, str):
if '亿' in value:
return float(value.replace('亿', ''))
elif '万' in value:
return float(value.replace('万', '')) / 10000
return np.nan
df['票房_亿'] = df['票房'].apply(convert_to_yi)
df['观众数_万'] = df['观众数'].str.replace('万', '').astype(float)
