Pandas数据分析入门:2小时掌握DataFrame核心操作与实战案例
很多人的第一份数据分析工作是从一张 Excel 表开始的。表里可能有几千行订单、几十个字段老板要求统计不同城市的销售额环比顺便找出哪些商品退款比例最高。Excel 能处理但每次筛选、透视、改格式都会耗费大量时间。Pandas 就是在这个场景下被广泛使用的它是 Python 生态里最常用的数据分析库核心对象 DataFrame 可以理解成一张可编程的表格支持读取、清洗、筛选、分组、聚合、透视以及可视化之前的数据准备。实际工作里并不需要记住 Pandas 的全部 API。把高频操作拆开看就是数据结构认知、环境准备、数据读取、数据清洗、数据转换、分组聚合、合并拼接和简单可视化这几块。这篇文章按 2 小时速通的节奏组织内容先建立 DataFrame 的基本认知再完成环境安装和数据读取接着做数据清洗和类型转换然后掌握筛选、分组、合并、透视等高频操作最后用一个销售订单小案例把整个流程串起来。文章后半部分还整理了高频报错、排查顺序和 27 个速学检查点适合刚学完 Python 基础、被 Excel 处理效率困扰或者准备数据分析面试的读者。1. 先建立 Pandas 的底层认知Series、DataFrame 和索引1.1 Series带标签的一维数组Series 可以理解成一个带标签的列表。普通列表[85, 92, 78]只能通过位置 0、1、2 访问Series 多了一层 index可以像字典一样用名字访问。创建 Series 时如果不指定 indexPandas 会自动生成 0 到 n-1 的整数索引。import pandas as pd s pd.Series([85, 92, 78], index[语文, 数学, 英语]) print(s) print(s[数学])输出结果语文 85 数学 92 英语 78 dtype: int64这里有一个容易误解的地方Series 由 values 和 index 两部分组成values 本质上是一个 numpy 数组。这意味着 Series 可以直接进行加法、乘法、比较等向量化运算这也是 Pandas 处理速度远快于普通 Python 循环的原因之一。在 DataFrame 内部每一列其实都是一个 Series。比如df[score]取出来就是一个带索引的 Series。理解了 Series 之后再去看 DataFrame 的列操作会顺畅很多。1.2 DataFrame可编程的表格DataFrame 是 Pandas 里最重要的结构可以理解成一张表格。它有列名columns和行索引index每一列有一个确定的数据类型不同列可以类型不同。import pandas as pd df pd.DataFrame({ city: [北京, 上海, 广州, 深圳], amount: [1200, 980, 1500, 760], order_count: [32, 21, 45, 18] }) print(df) print(shape:, df.shape) print(columns:, df.columns) print(index:, df.index) print(dtypes:) print(df.dtypes)输出的重点信息df.shape返回(4, 3)表示 4 行 3 列。df.columns返回列名列表可以像修改普通列表一样重新赋值。df.dtypes返回每一列的类型这一项在后续清洗时非常关键。用df[city]可以取出一列得到 Series用df.loc[1]可以取出一行同样得到 Series。这种“行列取数”的规则如果不熟悉可以先记住两个方法df[列名]取值列df.loc[索引]取值行后续再深入。1.3 索引在 Pandas 里的地位索引是 Pandas 的“灵魂”也是新手最容易绕晕的地方。默认索引是 0 到 n-1 的整数但实践中经常会出现时间戳索引、用户 ID 索引、城市名索引。索引会影响数据对齐、合并、去重和切片所以几乎每个真实项目里都会出现reset_index和set_index。df2 df.set_index(city) print(df2) print(df2.loc[北京]) df3 df2.reset_index() print(df3)set_index(city)把城市列变成行索引之后可以用字符串取值reset_index()再把索引还原成普通列。很多初学者在 groupby 之后发现数据不见了就是因为索引变成了分组键而没有 reset_index后面第 6 章会再强调这个坑。不同环境对 Pandas 的使用方式差异也比较大下面这张表用于建立整体认识项目学习环境生产环境数据量几百到几万行百万行以上要考虑内存版本当前最新版即可需要锁定版本并验证兼容异常处理报错后看堆栈需要 try-except 和日志输出交互式 print校验结果并落盘或入库运行方式脚本或 notebook定时任务、服务接口、调度平台明确这个差异后面使用read_csv、groupby、merge时就会自然考虑到性能和结果校验问题而不仅仅是“能跑通”。2. 环境准备Python 版本、Pandas 安装与第一份数据2.1 Python 与 Pandas 版本怎么匹配Pandas 是编译型扩展库对 Python 版本有要求。安装前先确认自己的 Python 版本避免装完最新版却发现当前解释器无法导入。python --version python -m pip install --upgrade pip python -m pip install pandas numpy openpyxl matplotlibPython 版本和 Pandas 的对应关系大致如下Python 版本建议的 Pandas 版本说明Python 3.8pandas 1.3.x 及以上如果环境允许建议升级 PythonPython 3.9pandas 1.4.x 或 2.x日常学习足够Python 3.10pandas 1.5.x 或 2.x注意 numpy 兼容性Python 3.11pandas 2.x推荐使用较新的 2.x 版本安装时pip 会自动解析当前 Python 能使用的版本不必手工指定精确版本号。但是如果系统里同时存在多个 Python 环境一定要确认pip install安装到的解释器和运行脚本的解释器是同一个。常见做法是在项目目录下创建虚拟环境python -m venv venvWindows 下激活命令是venv\Scripts\activatemacOS 和 Linux 下是source venv/bin/activate。后续安装依赖都会进入这个独立环境不会污染系统全局解释器。2.2 PyCharm 安装 pandas 包的方式使用 PyCharm 的时候不需要在命令行安装可以直接在项目设置里完成打开 File - Settings - Project - Python Interpreter。点击右侧的号。输入pandas选中后点击 Install Package。需要numpy、openpyxl、matplotlib时重复同样操作。如果安装速度很慢可以配置国内镜像源在 Packages 页面的 Manage Repositories 中新增镜像地址再用新地址重新搜索安装。安装完成后运行下面这段验证代码import pandas as pd import numpy as np print(pandas, pd.__version__) print(numpy, np.__version__)能正常输出版本号就说明环境已经可用。这里注意numpy是 Pandas 的底层依赖openpyxl是读写 Excel 文件的引擎matplotlib用于绘图安装时最好一次性装齐。2.3 第一份数据读取 CSV 和 Excel学习阶段优先使用 CSV 文件。CSV 是纯文本格式出错时打开原始文件就能看到问题。read_csv是 Pandas 最常用的入口之一。df pd.read_csv(orders.csv, encodingutf-8) print(df.shape) print(df.head())如果 CSV 文件不是 UTF-8 编码可能会直接报UnicodeDecodeError。Windows 环境下很多表格软件导出的是 GBK 编码这时可以用df pd.read_csv(orders.csv, encodinggbk)或者更宽容的encodinggb18030。写入操作推荐使用utf-8-sig这样用 Excel 打开生成的文件时中文不会乱码df.to_csv(orders_backup.csv, indexFalse, encodingutf-8-sig)读取 Excel 文件需要安装openpyxldf_excel pd.read_excel(orders.xlsx, sheet_name订单明细, engineopenpyxl) print(df_excel.head())读取阶段不要急着处理先把shape、head、dtypes打印出来确认数据量、表头和类型是否符合预期。这一步能避免后面分析时发现字段完全对不上。3. 拿到数据先做四件事读取、探查和数据类型确认3.1 用 head、info、describe 快速了解数据数据读取成功后先做四件事看前几行、看结构、看统计、看类型。print(df.head()) # 前 5 行 print(df.tail()) # 后 5 行 print(df.info()) # 每列非空数量、类型、内存占用 print(df.describe()) # 数值列统计信息 print(df.shape) # 行数和列数head和tail用来确认数据有没有读错比如表头错位、字段缺失、空行混入。info能同时看到每列的非空数量和 dtype这是判断数据质量的第一手资料。describe会输出 count、mean、std、min、25%、50%、75%、max 这些统计量可以快速发现金额列是不是有异常大值。注意describe默认只统计数值列。想查看字符串列的情况可以用df.describe(includeobject)它会给出 count、unique、top、freq适合快速看城市、品类这类分类字段。3.2 用 dtypes 理解列的数据类型Pandas 的 dtype 是许多问题的根源。看起来是数字的列实际可能是 object 字符串看起来是日期的列实际可能也是 object。如果不先确认后面排序、求和、画图都可能出错。常见 dtype 含义如下dtype含义常见问题int64整型可能混入 NaN 后变成 float64float64浮点型适合数值计算object字符串或混合类型数字列常被读成 objectbool布尔型比较运算结果datetime64[ns]日期时间需要专门解析category分类类型节省内存加快分组查看所有列的类型的代码print(df.dtypes) print(df.select_dtypes(include[object]).columns)如果一个数字列是 object在求和或groupby时会出现类型不匹配或者结果变成字符串拼接。处理思路是先用pd.to_numeric转换再继续分析。3.3 读取阶段最常见的三个坑读取阶段看似简单但有一批高频问题会在后续分析中反复干扰问题现象常见原因处理方法UnicodeDecodeError文件是 GBK 编码而用了 UTF-8换encodinggbk或encodinggb18030第一行数据被当成表头原文件没有表头read_csv(..., headerNone)并指定列名时间列变成 object日期字段没有解析parse_dates[date]或后续pd.to_datetime金额列变成 object原文件包含逗号、货币符号pd.to_numeric(errorscoerce)转换以日期列为例最推荐的做法是在读取时直接指定df pd.read_csv(orders.csv, parse_dates[order_date]) print(df.dtypes)这样读到内存时就是datetime64[ns]后续按月份、星期、小时分组都会方便很多。如果读取时忘了指定也可以在第 4 章的清洗阶段用pd.to_datetime补救。4. 数据清洗缺失值、重复值、类型转换和列名规范4.1 缺失值处理先判断、再统计、后处理缺失值是最常见的数据质量问题。不要一上来就dropna先统计哪些列有缺失、缺失比例是多少再决定策略。print(df.isna().sum()) print(df.isnull().mean()) # 缺失比例处理策略通常有几种缺失比例过高的列直接删除。数值列填充中位数或均值适合分布偏斜不大的数据。关键业务字段缺失比如订单号、用户 ID直接删除该行。时间序列数据使用前向填充。# 删除缺失比例超过 40% 的列 df df.dropna(axis1, threshlen(df) * 0.6) # 金额缺失时填充中位数 df[amount] df[amount].fillna(df[amount].median()) # 关键字段缺失删除整行 df df

相关新闻

最新新闻

日新闻

周新闻

月新闻