ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

《Python数据分析》第三版实战指南:环境配置与核心技巧

《Python数据分析》第三版实战指南:环境配置与核心技巧 写这篇东西之前我先说个现象每次有朋友来问“Python数据分析怎么入门”我基本都会推荐 Wes McKinney 那本《Python for Data Analysis》也就是国内读者熟知的《Python 数据分析》。但很多人翻了几章就卡住了卡住的地方往往不是书里的代码而是第一步的环境配置甚至装完 Python 之后不知道该用什么工具写代码。尤其第三版出来之后身边“弃书”的人反而更多了因为大家误以为第三版要学什么新东西实际上不是这样。这篇文章我就围绕《Python 数据分析第三版》展开结合日常使用和教学过程中遇到的高频问题把它拆成几个真正卡脖子的环节环境怎么搭、第三版到底改了什么、章节核心在哪、可视化怎么一次画到位、怎么从“看代码”过渡到“做项目”。每个环节我都会给出自己的操作习惯和踩坑记录方便你直接复制。1. 环境没搭好后面全白搭先解决“怎么运行代码”1.1 别再用系统自带解释器用 conda 隔离环境很多人下载安装 Python 之后直接pip install pandas就开始跑书里的代码。短期看没毛病但书里某些示例依赖特定版本的 NumPy、pandas一旦系统里装了别的项目要求的旧版本依赖冲突很快就来了。更隐蔽的问题是你根本不知道自己装到了哪个 Python 上。我自己平时用到数据分析基本不会碰系统自带的 Python而是为这本书单独建一个 conda 环境。原因很直接conda 能同时管理 Python 解释器版本和包依赖还能把每个项目拆开环境之间互相干扰的可能性降到最低。创建环境的命令非常简单在终端Windows 上建议用 Anaconda PromptmacOS/Linux 用自带终端执行conda create -n pyanalysis python3.11 pandas numpy matplotlib jupyter notebook这里解释一下为什么选 Python 3.11第三版书里的代码基于 Python 3.11 编写的虽然你用 3.10、3.12 也能跑通大部分内容但既然照着书学最好把解释器版本也对齐。pandas 建议直接装最新稳定版第三版出版时用的是 pandas 2.0现在装 2.1、2.2 也没问题API 基本兼容。Jupyter Notebook 则是为了逐行运行书里的示例代码方便看中间结果。1.2 编辑器选哪个VSCode 还是 Jupyter Notebook这个问题被问过太多次我的答案是两个都要用但阶段不同。刚开始读书的时候用 Jupyter Notebook 最顺手。因为它天然按单元格切分你可以把书里一段代码放在一个 cell 里按 ShiftEnter 一行一行跑随时看 DataFrame 长什么样、中间变量对不对。这种交互方式对理解 pandas 的数据结构很有帮助。等你要写稍微完整一点的脚本比如把一个“读取数据 - 清理 - 聚合 - 导出结果”的流程串起来Jupyter 就会显得松垮。这时候切到 VSCode配合 Python 扩展把.py文件跑起来或者直接右键用 “Run Python File in Terminal” 执行效率更高。关于 VSCode 里配置 Python 环境有个高频报错终端里执行python提示 “python was not found; run without arguments to install from the Microsoft Store”。这不是你没装 Python而是 Windows 的 PATH 没指对。解决办法是在 VSCode 里按CtrlShiftP输入 “Python: Select Interpreter”然后手动定位到你 conda 环境下的python.exe。路径通常在C:\Users\你的用户名\anaconda3\envs\pyanalysis\python.exe选好后新建终端再执行python --version看到Python 3.11.x就说明切换成功了。1.3 装包失败先学会看报错学习过程中一定会遇到装包失败的情况尤其是国内网络环境下装 PyPI 包。常见的报错就是连接超时或者一条特别长的ERROR: Could not find a version that satisfies the requirement。这类问题大多不是包不存在而是网络连接不稳定。我的做法是给 pip 加上国内镜像源一次性生效pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple如果已经遇到了一半安装一半失败的残留状态保险起见先把它卸载干净再重装pip uninstall pandas -y pip install pandas书里涉及的第三方库比较多我建议你遇到哪个装哪个不要一次性试图把整本书的依赖全部装齐那样出现“缺少依赖的依赖”时很难定位。2. 第三版和第二版的差异看似一样细节全变了2.1 升级点一pandas 2.0 与 PyArrow 带来的底层变化很多读者是从第二版直接跳到第三版的打开书发现目录结构看起来没什么大变化于是误以为“第三版就是多了几章练习”。实际上最大的变化不在你怎么调用 API而在 pandas 的底层实现。第三版基于 pandas 2.0之前read_csv默认返回的底层数据结构是一套 NumPy 数组加各种 Python 对象而现在 pandas 2.0 把 Apache Arrow 作为可选后端。Arrow 的好处是内存中的数据格式和磁盘上的列式格式更统一读大文件时性能提升非常明显。我实测过读取一个约 2GB 的 CSV 文件pandas 2.0 开启 PyArrow 后读取时间大约比默认模式快 20%-30%这还是在没有做任何额外调整的情况下。开启方式是在read_csv里指定 dtype_backendimport pandas as pd df pd.read_csv(large_file.csv, dtype_backendpyarrow)但注意如果你没有安装 pyarrow 包这个参数会直接报错。安装很简单pip install pyarrow2.2 升级点二字符串类型变更告别 object dtype 的坑第二版时期pandas 里的一列字符串默认是object类型带来的问题是你对整列做字符串操作时可能会因为某个非字符串元素导致类型混乱。第三版推荐用StringDtype也就是string类型。这样整列的数据类型语义更清晰也避免了一些隐式转换的坑。平时读取数据后我会主动把文本列转成 string 类型df[商品名称] df[商品名称].astype(string)这样至少能避免后续做字符串匹配、正则替换时遇到后缀.0之类的奇怪问题。尤其是从 CSV 读入的 ID 列如果不指定 dtypeExcel 里存的001会被读成1这种情况几乎每周都能碰到。2.3 表格结构的调整目录没变章节重心变了第三版目录和第二版整体结构相似但后半部分尤其是“时间序列”和“建模”相关章节代码示例有明显调整去掉了部分已经过时的 API 调用。对我这种用过第二版的人来说最需要注意的不是新功能而是那些“以前能跑现在跑不通”的写法。最典型的就是df.append()方法在 pandas 2.0 中被移除了。第二版示例里常见的“逐行添加数据到 DataFrame”现在要用pd.concat()来替代df_new pd.concat([df_existing, df_row], ignore_indexTrue)这属于第二版到第三版迁移时最容易踩的坑之一。如果你是从网上找旧代码学习很可能会碰到append不存在或iteritems不存在这类报错。遇到这种报错不要慌去查当前 pandas 版本的 API 文档确认替代方法就行。3. 书本核心章节的价值别把时间浪费在背 API 上3.1 数据结构和清洗搞定以后后面章节自然通第三版前三章主要讲 NumPy 和 pandas 的核心对象这部分信息量很密也很容易让初学者产生“我全记住了”的错觉。实际上你不需要背下所有方法但要反复搞清楚三个对象之间的关系Series、DataFrame和Index。我见过不少读者在第 5 章“数据清洗与预处理”卡住不是因为操作复杂而是没搞懂索引对齐机制。举个例子import pandas as pd s1 pd.Series([1, 2, 3], index[a, b, c]) s2 pd.Series([10, 20, 30], index[b, c, d]) print(s1 s2)结果是a NaN b 22.0 c 33.0 d NaN dtype: float64只有索引b和c能对上a和d自动变 NaN。这就是“索引对齐”它是 pandas 最核心也最容易被忽视的设计。如果没有意识到这一点在合并多个表时很容易得到大量 NaN且完全不知道哪里出了问题。清洗数据时我还习惯做三件事先df.info()看各列类型和缺失情况再df.isnull().sum()看缺失数量最后用df.duplicated().sum()查重复行。书里也是这套思路但不少人直接跳到dropna、fillna反而把问题搞复杂了。整理一个常用对照表方便你随手查操作目标第二版习惯用法第三版推荐用法说明删除缺失值df.dropna()df.dropna()参数用法一致注意how、thresh填充缺失值df.fillna(0)df.fillna(0)建议先用value_counts确认缺失比例删除重复行df.drop_duplicates()df.drop_duplicates()注意subset和keep参数合并数据表df.append(df2)pd.concat([df, df2])append 已被移除筛选行df[df.a 0]df.loc[df[a] 0]显式用.loc避免链式索引问题分组汇总df.groupby(col).mean()df.groupby(col).mean(numeric_onlyTrue)新版需指定仅对数值列计算3.2 聚合与分组groupby 的返回类型你真的懂了吗groupby 是 pandas 最强大的功能之一也是初学者最容易“自以为懂了”的功能。很多人执行完df.groupby(城市)[销售额].sum()后只知道拿到了一个 Series但不知道这里面的索引是“城市”也不知道怎么把结果转回 DataFrame。更关键的是groupby之后的聚合操作可以一次传多个函数df.groupby(城市)[销售额].agg([sum, mean, count, std])这条代码会返回一个表格每一行是一个城市列分别为销售总额、平均销售额、订单数和标准差。实际业务中比如供应链数据分析里经常要按仓库维度同时看周转天数、库存总量、缺货次数用这种一次性聚合就不用来回写多个 GroupBy 对象了。还有一个小技巧分组之后想保留其他列就用groupby(..., as_indexFalse)这样分组键会变成普通列而不是索引。配合reset_index()也能达到类似效果。3.3 类型转换和文本处理“看不见的 jar 包”往往是罪魁祸首第三版里多次强调类型转换现实业务中这确实是重灾区。我从 Excel 导出的 CSV 里读数字列时经常遇到“看上去是数字实际上 pandas 把它读成了字符串”的情况。原因往往是某些行里混入了空格、逗号或括号。处理思路是先清洗再转换不要直接astype(float)df[金额] df[金额].astype(str).str.replace(,, ).str.replace( , ) df[金额] pd.to_numeric(df[金额], errorscoerce)这里errorscoerce的意思是如果某个值转不了数字就变成 NaN而不是让整个程序崩溃。然后把 NaN 再单独处理比如填充 0 或丢弃。字符串处理这一块pandas 的.str访问器一定要熟练因为它能让你免于写一堆 Python 原生循环。str.extract、str.contains、str.split这三个方法在清洗客户地址、电话号码、订单编号时非常实用。比如从“北京市朝阳区××路1号”里拆分省市区用df[省] df[地址].str.extract(r(.*?省|.*?自治区|北京市|上海市|天津市|重庆市))正则表达式初看难但一旦能读懂简单的提取规则数据清洗效率能翻倍。书里这章篇幅不多我建议你额外找一些正则实战案例配合练否则前面清洗步骤不规范后面分析全是垃圾进垃圾出。3.4 时间序列resample 和 rolling 是业务分析的主旋律第三版的时间序列章节比第二版更贴近金融、零售和供应链里的真实场景。我特别建议把to_datetime和resample练到位因为日常做“月度销售额汇总”“周活跃用户数”这类指标时90% 的操作都靠它们。一个很有用的操作是按月统计每日销售额df[日期] pd.to_datetime(df[日期]) df.set_index(日期, inplaceTrue) df.resample(M)[销售额].sum()resample(M)里的 M 代表月底汇总。类似的还有W按周、Q按季度、Y按年。注意pandas 2.2 之后更推荐ME而不是M因为M从“月末”改成了“月终”但为了兼容旧代码仍可继续使用M。不会报错但官方建议新代码用ME更明确。滚动计算rolling也很常用。比如算过去 7 天的平均销售额一条代码搞定df[销售额_7日均值] df[销售额].rolling(window7).mean()滚动窗口的计算方式跟 resample 完全不同它不改变数据的行数而是按顺序每 7 行算一次均值。理解这个区别能避免在时间趋势图上画出“跳变”的曲线。4. 数据可视化一张图让你明白“横坐标到底该怎么调”4.1 中文乱码和负号显示先解决这两个历史难题Matplotlib 默认字体不支持中文这已经是老生常谈的问题了。第三版书中也有提到但很多人还是会忘记第一时间设置。我的建议是在写任何画图代码之前固定在文件开头放一段全局设置import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [SimHei] # 或用 Microsoft YaHei plt.rcParams[axes.unicode_minus] False第二条专门解决负号显示成方块的问题。如果你在 macOS 上跑字体名通常用Arial Unicode MS或PingFang SCLinux 下则可能要装中文字体后设置为Noto Sans CJK SC。4.2 横坐标太密集一个参数就能解决最近热搜词里有一条是“python画图横坐标太密集”这个问题几乎每个人都会遇到。当你把按日拆分的 365 个点全部画在线图上x 轴标签就会叠成一团黑块根本没法看。我的解决方案一般有三种方案一旋转标签并每隔 N 个显示plt.xticks(rotation45) # 每隔 10 天显示一个标签 ticks df.index[::10] plt.xticks(ticks)方案二用 locator 控制刻度密度import matplotlib.dates as mdates ax df.plot(x日期, y销售额, figsize(12, 6)) ax.xaxis.set_major_locator(mdates.MonthLocator(interval1)) ax.xaxis.set_major_formatter(mdates.DateFormatter(%Y-%m)) plt.xticks(rotation45)这样 x 轴只按月份显示刻度任何密集程度的数据都不会叠标签。方案三如果数据点是长时序直接改成面积图或聚合图把日数据 resample 成周或月之后再画图图形更平滑也更适合汇报场景。毕竟老板通常只关心月度趋势而不是 7 月 3 日和 7 月 4 日到底差了多少。4.3 一张图上看多个维度用 Pandas 内置 plotting 就够了第三版里的可视化章节大多还是基于 matplotlib 和 pandas 的内置画图方法。pandas 的.plot()参数非常直观对新手非常友好。比如箱线图检查异常值df.boxplot(column销售额, by仓库) plt.xticks(rotation45) plt.title() plt.suptitle()一个散点矩阵能快速看多个数值列之间的相关性pd.plotting.scatter_matrix(df[[销量, 销售额, 库存]], figsize(10, 10))还有一个小技巧作图时用subplotsTrue可以把多个指标拆成多个子图避免不同量纲的变量画在同一张图里互相压制。这一招在做电商日报、供应链看板时经常用得上。5. 从“看代码”到“做项目”几类真实案例的落地思路5.1 经典案例销售数据分析从数据清洗到结论热搜词里“python编程数据分析简单案例及答案”和“数据分析项目”出现的频率非常高。很多人掌握了一堆 API还是不知道拿到一份 CSV 之后应该先干什么。我平时练习时用的完整小项目流程是第一步明确分析目标。比如“分析某店铺过去一年各品类销售额变化趋势”。目标不同清洗方式就不同这是很多人忽略的。第二步读取数据并检查质量import pandas as pd df pd.read_csv(sales.csv, parse_dates[订单日期]) print(df.info()) print(df.isnull().sum()) print(df.describe())第三步数据清洗删除完全重复的行处理缺失值例如订单金额缺失的直接丢弃还是填充 0取决于分析场景把商品分类、区域等文本列统一大小写或去空格第四步聚合分析monthly df.resample(M, on订单日期)[销售额].sum() category_sales df.groupby(商品分类)[销售额].sum().sort_values(ascendingFalse)第五步画图封装成报表。这里注意把图表标题、坐标轴标签写清楚因为汇报时要直接给别人看。5.2 从 Excel 到 Python把重复劳动脚本化很多人问“Excel 能做的分析为什么要学 pandas”我觉得最有力的理由是“自动化”。比如你每周要从某个系统导出一份订单表在 Excel 里做透视表、VLOOKUP、画图每一步都需要手动点而用 pandas 脚本只需要把数据文件路径扔进去运行一次所有报表和图表自动生成。我在做商业数据分析时经常把分析流程封装成函数输入一个 CSV 路径输出一个汇总表和一张图def generate_sales_report(csv_path): df pd.read_csv(csv_path, parse_dates[日期]) df df.drop_duplicates() summary df.groupby(城市, as_indexFalse)[销售额].sum() summary.to_csv(城市销售汇总.csv, indexFalse, encodingutf-8-sig) return summary这里用encodingutf-8-sig是因为直接导出 UTF-8 CSV 用 Excel 打开会乱码加-sig后 Excel 能正常识别。5.3 与 SQL、其他数据分析工具的关系热搜词里有“SQL server数据分析”“R语言数据分析案例”等结合第三版中大量使用 SQL 操作的思路我想强调一点pandas 和 SQL 不是对立关系而是互补关系。数据量小、列数几十的情况用 pandas 做灵活探索很快数据量特别大比如千万行级别建议先放 SQL 里做粗粒度筛选和聚合把结果量降下来再读进 pandas。第三版书里也有从 SQLite 读取数据的示例这展示了 pandas 对接数据库的便利性。实际项目中我最常用的组合是SQL 负责“取数”pandas 负责“清洗 可视化”。至于“有哪些免费的本地离线表格数据分析软件”这个问题我在这个领域也试过不少开源工具但最终都绕回 Python pandas Jupyter。原因很简单离线报表需求对数据隐私要求高不允许传到云端而 pandas 完全本地运行只要有原始数据文件就能生成分析结果。额外安装一个xlsxwriter就能把结果直接写回带格式的 Excel 表格中。6. 常见环境报错和运行报错给你一套排查思路6.1 报错一python was not found在 Windows 上跑python时出现这个通常意味着 Python 没有被正确加入 PATH。解决方式我前面已经提过在 VSCode 用“Select Interpreter”挑选环境。如果是想直接在 CMD 里运行可以加环境变量把 conda 根目录和Scripts目录都加进去。老实说日常我根本不建议手动改 Windows 环境变量直接在 Anaconda Prompt 里进入你的 conda 环境最省事。6.2 报错二ModuleNotFoundError: No module named pandas这个报错很多人装完包仍然出现。最可能的原因是你装的包和当前执行脚本用的 Python 解释器不是同一个。例如 Jupyter 里 kernel 用的是基础环境而你pip install pandas用的是 conda 的 pyanalysis 环境两边对不上。排查方法是按顺序执行import sys print(sys.executable)看输出结果是否指向你期望的python.exe。如果不是就回到 VSCode 或 Jupyter 去切换 kernel。6.3 报错三file E:\...\python\lib\site-packages\numpy\__init__.py...这类报错往往是环境混杂导致的。比如有些人磁盘上有多个 Python 安装路径pip 安装 numpy 到某个目录运行时 pydantic、pandas 又依赖另一个目录里的 numpy版本不一致就崩。最直接的解决方法是把当前环境清空重建或者用pip list查看已经装好的包版本确认是否存在不兼容的组合。还有一点如果之前用过pip install -u --pre xxx之类的方式安装了预发布包某个核心库可能被“超前升级”导致 pandas 崩溃。这时把该核心库退回到稳定版通常就能解决。6.4 数据层面的报错ValueError: cannot reindex from a duplicate axis这个报错是操作 DataFrame 时索引出现重复造成的。比如你reset_index(dropTrue)没生效或者concat时索引没重置就会在reindex时炸掉。处理方法一句话执行任何可能导致索引变化的操作前先查看df.index.is_unique。如果不是唯一就reset_index(dropTrue)。6.5 正则表达式报错re.error: multiple repeat写str.extract正则时如果模式里出现连续的量词比如*后面又跟一个*就会触发这个报错。我一般先在在线正则工具里测试好再粘回代码能省不少时间。7. 几个进阶方向和我的个人体会第三版书读完之后想往深处走我的建议是三条路径一是强化数据可视化把 matplotlib 和 seaborn 练熟最好能达到“看到业务指标就能想出合适的图类型”二是学习更灵活的数据处理库比如 Polars 和 PySpark它们在大数据场景下的效率和熊猫系完全不同三是掌握一点统计建模和机器学习基础这样数据分析不会停在“描述性统计”还能往预测方向延伸。热搜词里“100个python实战项目”“python量化交易策略代码”“层次聚类”“spark数据分析案例”“seurat空间转录组数据分析”这些其实都是不同方向的人在找更垂直的资料。我的忠告是基础不牢求大而全的案例没有意义。第三版整本书吃透配合两三个真实数据集做完整分析项目比泛泛地看一百个项目代码有用得多。我个人在实际操作中的体会是数据分析不是“会把代码跑通”而是“能在数据里找到让人信服的结论”。书里的每一段代码都是为了让你快速验证一个想法因此每学完一章最好都找一个现实中的数据集去套用。比如学完 groupby 后去统计你自己电商订单里的品类销售占比学完时间序列后试着预测一下下个月的走势。只有把书里的知识和真实业务场景粘在一起才算真正把这本书读进了脑子里。最后分享一个小技巧ad_blocker 都没它实用——把所有练习题完整敲一遍不要复制粘贴。你会发现很多报错不是书上的问题而是自己手滑或理解偏差导致的。排查这些报错的过程恰恰是最快提升能力的过程。
返回列表