ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Pandas 2小时快速上手:从环境搭建到数据分析实战

Pandas 2小时快速上手:从环境搭建到数据分析实战 这次我们直接解决一个实际问题只有 2 小时怎么把 Pandas 学到能上手干活。Pandas 是 Python 数据分析绕不开的那个库数据读取、清洗、分组统计、透视汇总、时间聚合一张 CSV 或者 Excel 表到你手里后要做的事它基本都覆盖了。整个学习过程不需要 GPU不依赖服务器普通笔记本就能跑完安装就是一条 pip 命令的事。这篇文章不是教科书是按实际处理数据时最常用的流程来组织先搭环境再理解两个核心对象然后按“读取 - 清洗 - 筛选 - 聚合 - 透视 - 导出”的顺序走完一条完整链路最后给一个 30 分钟能跑通的电商订单分析案例。学完你至少能独立处理一份中等规模的表格数据而不是只会在网上看教程。适合三类读者Python 刚学完基础语法、想往数据分析方向走的Excel 用得挺熟、想换成 Python 批量处理数据的以及正在准备数据分析面试、需要快速梳理核心知识点的。文章不会绕弯子每个步骤都会直接给出可运行的代码和判断标准。1. Pandas 核心能力速览能力项说明项目类型Python 数据处理与分析核心库主要功能表格数据读取、清洗、筛选、转换、聚合、透视、时间序列统计、结果导出依赖基础Python通常建议 3.9 及以上当前 pandas 2.x 系列在 Python 3.10、3.11、3.12 下都能正常使用硬件要求不需要 GPU普通 PC 即可运行安装方式pip / conda / PyCharm 图形界面支持数据量内存能装下的表格数据超大文件可通过分块读取或高效格式处理是否支持 API本身不是服务没有 HTTP 接口但可以嵌入到 FastAPI、Flask 等脚本服务中处理数据是否支持批量任务支持配合 glob 可以批量读入多个 CSV 文件并循环处理学习成本基础路线 2 小时进阶熟练取决于实际练习量适合人群数据分析入门、Excel 转 Python、数据岗面试准备Pandas 最常见的学习误区是一上来死记几十个函数。实际工作中翻来覆去用的就是读取、清洗、分组、聚合、透视这几类。建议先把常用链路跑通再按需补充冷门参数。2. 适用场景与使用边界Pandas 适合处理三类问题。第一类是脏数据清洗比如导入数据后出现缺失值、重复行、类型错乱、列名不规范这些用 Pandas 几行代码就能批量处理。第二类是业务统计报表比如按城市、类目、时间维度汇总销售额生成日报、周报或月报。第三类是探索性数据分析拿到一份新数据后快速看分布、看相关性为后续建模和决策打底。它不适合处理超大规模数据。当单表数据量达到几千万行、几个 GB 甚至更多时Pandas 的内存压力会很明显这种情况下更稳妥的选择是 Spark 或 Dask。它也不是流式处理引擎实时数据管道交给 Kafka、Flink 这类工具更合适。复杂可视化建议配合 matplotlib 或 seaborn 使用Pandas 自带的绘图只适合快速看一眼趋势。还有一个边界必须提醒如果数据里包含手机号、身份证、地址、用户行为记录等个人信息分析前要先脱敏或者确认有合法的数据使用授权。做商业数据分析时数据来源是否合规、能否用于当前用途都要提前确认。这不是小事尤其是把分析结果对外发布或做成产品演示的时候。3. 环境准备与前置条件Pandas 对新手最友好的地方在于环境几乎不会卡人。你只需要一个能跑 Python 的环境不需要显卡不需要 CUDA也不需要配 Docker。3.1 检查 Python 版本打开命令行输入python --version如果显示 Python 3.9 或更高版本直接下一步。如果还没装 Python建议去 Python 官网下载 3.10 或 3.11 版本安装时勾选“Add Python to PATH”。Python 3.10 和 pandas 2.x 是当前很常见的一组搭配pip 会自动选择兼容版本。3.2 安装 Pandas命令行执行pip install pandas如果下载速度慢可以换国内镜像源pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple使用 Anaconda 的用户可以执行conda install pandas验证安装是否成功python -c import pandas as pd; print(pd.__version__)能正常输出版本号说明安装完成。3.3 PyCharm 中安装 Pandas如果你习惯用 PyCharm不用打开命令行。打开项目后按下面步骤操作进入File - Settings - Project - Python Interpreter。点击左侧的加号按钮。搜索pandas。选中后点击Install Package等待安装完成。安装完成后在代码里import pandas as pd不再报错即可。PyCharm 的好处是虚拟环境和安装依赖都在图形界面里完成对新手更友好。3.4 编辑器推荐写 Pandas 代码常用的工具有三个Jupyter Notebook、VS Code、PyCharm。Jupyter 适合探索式分析因为每段代码独立执行看中间结果很方便学习阶段推荐优先用它。VS Code 和 PyCharm 适合写正式的脚本和工程化代码比如批量处理任务和定时报表。不管用哪个核心逻辑都一样。4. 核心概念Series 与 DataFramePandas 里只有两个对象需要重点理解Series 是一列数据DataFrame 是一张二维表。DataFrame 由多个 Series 组成可以理解成 Excel 里的一个 Sheet有行有列列名对应表头行号对应行索引。4.1 创建 DataFrameimport pandas as pd df pd.DataFrame({ 姓名: [张三, 李四, 王五], 部门: [技术部, 产品部, 技术部], 工资: [12000, 11000, 13000] }) print(df)输出会直接展示一张整齐的二维表。这是 Pandas 最核心的体验数据结构本身就是表格形态和 Excel 天然对齐。4.2 查看数据基本信息拿到一份新数据先不要急着处理先用几个方法建立整体认识# 前 5 行 print(df.head()) # 数据的行数、列数、列名和类型 print(df.info()) # 数值列的统计概览会输出均值、标准差、最小值、四分位数 print(df.describe()) # 列名 print(df.columns)df.head()是入门阶段使用频率最高的方法它默认显示前 5 行传入数字可以控制显示行数。df.info()用来确认列数量和每一列的数据类型。df.describe()能直接看到工资列的分布情况新手做探索性数据分析时习惯先跑一遍这三个方法。4.3 访问列和添加列# 取一列返回 Series print(df[工资]) # 取多列返回 DataFrame print(df[[姓名, 工资]]) # 新增一列直接用已有列计算 df[年终奖] df[工资] * 2 print(df)理解 Series 和 DataFrame 的区别非常关键。取单个列得到 Series取多个列得到 DataFrame很多报错都源于把 Series 当 DataFrame 用或者反过来。学习阶段可以刻意观察一下返回值类型。5. 数据读取与导出实际工作中数据很少手动输入绝大多数情况是从 CSV 或 Excel 文件读取。5.1 读取 CSVimport pandas as pd df pd.read_csv(sales.csv) print(df.head())如果文件有中文且出现乱码指定编码df pd.read_csv(sales.csv, encodingutf-8) # Windows 下部分文件可能是 GBK 编码 df pd.read_csv(sales.csv, encodinggbk)read_csv的常用参数包括sep指定分隔符默认是逗号有些文件用\t分列。header指定表头在第几行默认第 0 行。index_col指定哪一列作为行索引。parse_dates把日期列解析成时间类型。dtype指定某一列的数据类型避免 ID 被读成数值型。例如df pd.read_csv( sales.csv, encodingutf-8, parse_dates[订单日期], dtype{订单号: str} )5.2 读取 Excel读取 Excel 需要额外安装 openpyxlpip install openpyxl然后使用df pd.read_excel(sales.xlsx, sheet_nameSheet1)sheet_name不写时默认读第一个工作表可以传工作表名称也可以传索引。5.3 导出数据# 导出 CSVindexFalse 表示不写行索引 df.to_csv(clean_data.csv, indexFalse, encodingutf-8-sig) # 导出 Excel df.to_excel(clean_data.xlsx, indexFalse)这里重点强调encodingutf-8-sig。如果只写utf-8用 Excel 打开导出的 CSV 时中文很可能乱码。加上-sig可以避免这个问题这是实际项目里很实用的小经验。6. 数据清洗新手最容易卡住的部分数据分析 70% 的时间花在清洗数据上这不是夸张。Pandas 清洗主要解决三个问题缺失值、重复值、数据类型错乱。6.1 处理缺失值# 查看每个列缺失值数量 print(df.isna().sum()) # 删除包含缺失值的行 df_cleaned df.dropna() # 用固定值填充 df[销量] df[销量].fillna(0) # 用当前列的均值填充 df[销量] df[销量].fillna(df[销量].mean()) # 前向填充适合时间序列数据用上一行的值填充当前缺失值 df[价格] df[价格].fillna(methodffill)这里注意dropna()默认会删除任何一行只要存在缺失值要谨慎使用。数据量大的时候宁可先用isna().sum()看清楚缺失分布再决定是删除还是填充。6.2 删除重复值对重复值处理有一个很常见的需求如果指定两列的值均相同则只保留第一条数据。这和drop_duplicates的用法完全对应。# 删除所有列完全重复的行 df df.drop_duplicates() # 只按指定列判断重复保留第一条 df df.drop_duplicates(subset[用户ID, 商品ID], keepfirst)keep参数有三个值first保留第一条默认就是它。last保留最后一条。False重复的全部删除。判断重复前最好先看一眼重复情况print(df.duplicated(subset[用户ID, 商品ID]).sum())这个代码会返回重复行数方便你判断是否需要清理。6.3 数据类型转换常见的坑是读取 CSV 后日期列变成字符串数值列变成对象导致排序和聚合结果异常。# 强制转换为数值类型errorscoerce 会把无法转换的值变成 NaN df[销量] pd.to_numeric(df[销量], errorscoerce) # 转换日期列 df[订单日期] pd.to_datetime(df[订单日期], format%Y-%m-%d) # 用 astype 转普通类型 df[部门] df[部门].astype(str) df[工资] df[工资].astype(float)to_numeric和to_datetime是审计数据时最重要的两个函数。拿到数据后先跑df.info()如果发现本应是日期或数值的列显示为 object说明需要做类型转换。还有一个值得掌握的技巧是用apply批量处理一行或一列的复杂逻辑。# 把收入区间统一成标准化分类 def classify(income): if income 10000: return 高收入 elif income 5000: return 中等收入 return 低收入 df[收入水平] df[工资].apply(classify)7. 筛选、排序与条件查询数据清洗完之后下一步就是按条件提取需要的数据。7.1 按条件筛选行# 筛选工资大于 12000 的记录 df_high df[df[工资] 12000] # 多条件筛选工资大于 12000 且部门是技术部 df_tech df[(df[工资] 12000) (df[部门] 技术部)] # 筛选部门为技术部或产品部 df_tech_product df[df[部门].isin([技术部, 产品部])]布尔筛选的核心是括号里的表达式会生成一组 True 和 False 组成的布尔 Series然后用它来过滤 DataFrame。条件之间用表示“且”用|表示“或”括号不能省略否则容易出错。7.2 使用 loc 和 ilocloc按标签取值iloc按位置取值# 取第一行第一列 print(df.iloc[0, 0]) # 取前 3 行工资和年列 print(df.loc[:2, [姓名, 工资]]) # 条件筛选后取指定列 print(df.loc[df[工资] 12000, [姓名, 部门]])新手推导一下这个逻辑loc第一个参数是行筛选条件第二个参数是列名列表。这种写法在数据处理中非常常用尤其在修改特定行特定值时。7.3 排序# 按工资升序 df_sorted df.sort_values(工资) # 按工资降序 df_sorted df.sort_values(工资, ascendingFalse) # 多个列排序先按部门再按工资降序 df_sorted df.sort_values([部门, 工资], ascending[True, False])7.4 使用 query 方法如果条件比较多可以用query让代码更清晰df_result df.query(工资 12000 and 部门 技术部)query的优点是写起来接近 SQL 或自然语言适合条件较多的场景但它的性能和布尔索引差不多选哪个主要看可读性。8. 分组聚合与透视表分组聚合是 Pandas 数据分析最重要的能力它对应 SQL 里的GROUP BY。用法是先指定分组列再对数值列做统计。8.1 基础分组统计# 每个部门的平均工资 result df.groupby(部门)[工资].mean() print(result) # 每个部门的工资合计、均值、人数 result df.groupby(部门)[工资].agg([sum, mean, count]) print(result)groupby(部门)[工资]的含义是按部门分组然后只看工资列。后面的聚合函数可以是mean()、sum()、max()、min()、count()等。8.2 多列聚合有时候需要同时统计多个指标比如每个部门每个月的销售额和订单数result df.groupby([部门, 月份]).agg({ 销售额: [sum, mean], 订单号: count })这样会生成一个带层级索引的 DataFrame看起来可能稍微复杂但思路很直接分组列放在一起聚合字典告诉 Pandas 每一列要算什么。8.3 透视表透视表和 Excel 数据透视表是同一个概念用pivot_table实现pivot pd.pivot_table( df, index部门, columns月份, values销售额, aggfuncsum, fill_value0 ) print(pivot)运行后你会看到一张交叉表行是部门列是月份单元格是销售额合计。fill_value0会把没有数据的交叉位置补成 0避免出现 NaN。透视表在做日报、周报和月度分析时非常实用。业务人员提出“按城市和品类看销量”这类需求时不要写复杂的循环直接一个pivot_table就能出结果。9. 多表合并与时间序列真实项目的数据通常分散在多张表比如订单表、用户表、商品表需要连接起来才能分析。9.1 concat 纵向拼接df_all pd.concat([df_jan, df_feb, df_mar], axis0, ignore_indexTrue)axis0表示按行拼接ignore_indexTrue表示重新生成连续的索引。这个操作适合合并月份、分城市存储的同类数据。9.2 merge 横向关联df_with_user pd.merge( df_order, df_user, on用户ID, howleft )how参数控制连接方式inner内连接只要用户表也存在的订单。left左连接保留订单表全部行用户表缺失的字段填 NaN。right右连接。outer全连接保留两边的全部数据。日常报表用left最多因为通常订单表是主体其他表信息是补齐。9.3 时间序列处理时间列要先用to_datetime转成时间类型然后才能做日期聚合。df[订单日期] pd.to_datetime(df[订单日期]) df.set_index(订单日期, inplaceTrue) # 按月汇总销售额 monthly df[销售额].resample(ME).sum() print(monthly)resample是时间序列聚合的核心方法参数表示聚合粒度D按天。W按周。ME按自然月这里如果要写M也可以但在新版 pandas 中推荐使用ME。QE按季度。YE按年。如果只想提取日期的年、月、日不用设置索引直接df[年份] df[订单日期].dt.year df[月份] df[订单日期].dt.month df[星期] df[订单日期].dt.dayofweek这样就能按“年份 月份”做普通分组聚合对新手来说更直观。10. 实战案例电商订单数据快速分析这一节把前面所有知识点串起来。用一份模拟的订单数据在 30 分钟内跑通完整流程。10.1 构造示例数据import pandas as pd sales pd.DataFrame({ 订单号: [1001, 1002, 1003, 1004, 1005, 1006], 日期: [2025-01-03, 2025-01-05, 2025-02-10, 2025-02-15, 2025-03-01, 2025-03-12], 城市: [北京, 上海, 北京, 广州, 上海, 北京], 类目: [数码, 服装, 数码, 食品, 服装, 数码], 销售额: [2000, 350, 1500, 120, 420, 1800], 数量: [1, 3, 1, 2, 2, 1] }) sales[日期] pd.to_datetime(sales[日期]) print(sales)这里用到两个知识点创建 DataFrame 和转日期类型。数据只有 6 行但流程和真实数据完全一致。10.2 数据概览与清洗print(sales.info()) print(sales.describe()) print(sales.isna().sum()) # 删除重复行这里按订单号判断 sales sales.drop_duplicates(subset订单号, keepfirst) # 新增客单价列 sales[客单价] sales[销售额] / sales[数量]运行后可以观察到info()显示各列类型describe()给出销售额和数量的统计分布isna().sum()确认缺失情况。如果没有任何缺失说明数据质量还行可以直接进入聚合阶段。10.3 业务问题分析第一个业务问题按月汇总销售额。monthly sales.set_index(日期).resample(ME)[销售额].sum() print(monthly)结果会显示每个月有一个汇总值这就是月度销售趋势。第二个业务问题不同城市的哪个类目销量最高。pivot pd.pivot_table( sales, index城市, columns类目, values销售额, aggfuncsum, fill_value0 ) print(pivot)这个透视表直接回答业务问题。不需要写任何循环一行代码搞定。第三个业务问题不同类目的销售额占比。category_summary sales.groupby(类目)[销售额].agg([sum, count]) category_summary[占比] category_summary[sum] / category_summary[sum].sum() print(category_summary)占比列直接反映了每个类目对总销售额的贡献。10.4 导出分析结果sales.to_csv(sales_clean.csv, indexFalse, encodingutf-8-sig) pivot.to_excel(sales_pivot.xlsx)导出时记得路径下有写入权限。实际项目中这种脚本可以直接接到定时任务里实现每日自动生成报表。10.5 判断分析结果是否合理判断标准是每个输出的行数、聚合值是否符合预期。比如月份应该只有 3 个汇总值城市透视表应该是 3 行 3 列的二维表。如果输出比预期少或多优先检查日期列是否真的转成了时间类型、是否存在字符串残留。11. 批量文件处理与性能优化Pandas 在实际工作中经常会遇到“几十个 CSV 文件需要合并”的情况这时不要把每个文件复制粘贴到 Excel。11.1 批量读取多个 CSVimport glob files glob.glob(data/*.csv) frames [] for f in files: df pd.read_csv(f) frames.append(df) df_all pd.concat(frames, ignore_indexTrue) print(df_all.shape)glob.glob(data/*.csv)会匹配目录下所有 CSV 文件然后循环读取、拼接最后得到一份完整数据。这是 Pandas 做批量任务最常见的姿势。如果文件很多建议在循环里加日志for f in files: print(f正在处理: {f}) df pd.read_csv(f) frames.append(df)这样即使中途失败也能快速定位是哪个文件出了问题。11.2 大文件分块读取单个 CSV 过大时可以用chunksize分块处理result [] for chunk in pd.read_csv(large_data.csv, chunksize10000): result.append(chunk.groupby(类目)[销售额].sum()) final pd.concat(result).groupby(level0).sum() print(final)分块读取的核心是每次只处理一万行最终把每个块的聚合结果合并。这样内存占用大幅下降大文件也能跑动。11.3 使用 Parquet 和 Feather处理较大的表格数据时CSV 不是最优格式。Parquet 和 Feather 是列式存储格式读写速度更快文件体积更小。# 写入 df.to_parquet(data.parquet) df.to_feather(data.feather) # 读取 df_parquet pd.read_parquet(data.parquet) df_feather pd.read_feather(data.feather)需要先安装pyarrowpip install pyarrowParquet 在数据分析领域使用很广泛因为它不仅快还保留了数据列的类型信息不会像 CSV 一样读取后还要重新转日期、转数值。Feather 的性能也很好而且更适合本地开发时的临时交换数据。11.4 向量化操作代替循环新手处理数据时很容易写for i in range(len(df))但 Pandas 绝大多数运算都可以直接对整列操作性能差异非常明显。# 不推荐单行循环累加 total 0 for price, qty in zip(df[价格], df[数量]): total price * qty # 推荐向量化计算 df[成交金额] df[价格] * df[数量] total df[成交金额].sum()后端再用 numpy 做矩阵运算时向量化的收益还会更大。实际项目中几百万行数据用循环可能要跑几分钟向量化后往往只要几秒。12. 常见问题与排查方法新手使用 Pandas 经常会遇到下面这些报错大部分都是固定套路。问题现象可能原因排查方式解决方案ModuleNotFoundError: No module named pandas没装 pandas或装到了另一个 Python 环境命令行执行pip show pandas执行pip install pandas确认用的是同一个解释器读取中文 CSV 乱码编码参数不正确查看文件原始编码用encodingutf-8或encodinggbk重试KeyError列名不存在打印df.columns查看实际列名修正列名注意空格和大小写SettingWithCopyWarning在 DataFrame 切片上尝试赋值看警告信息定位代码位置用df.loc赋值或用.copy()创建副本日期聚合结果为空或不完整日期列没有转换时间类型用df.info()查看列类型用pd.to_datetime转换后再聚合MemoryError数据量过大内存不足查看文件大小和内存占用分块读取、只保留必要列、改用 parquet/featherastype转数值失败列中存在非数值字符打印该列非空值先用pd.to_numeric(errorscoerce)处理分组结果顺序和预期不同groupby默认会排序看分组列是否有分类或数字用sortFalse或用sort_values重新排序还有一个常见问题是 Python 3.10 应该用哪个 pandas 版本。直接执行pip install pandaspip 会自动选择兼容的 pandas 2.x 版本一般不需要手动指定。如果遇到安装报错优先更新 pip 再安装pip install --upgrade pip pip install pandas13. 最佳实践与下一步学习 Pandas 最有效的路径不是把所有函数背一遍而是动手处理真实数据。这里给出几个建议。第一先跑通最小链路。第一次练习只需要十行代码读取一份 CSV看info()算一个groupby导出一个结果。链路通了后续扩展才有基础。第二保留一套最小可运行脚本模板。把读取、清洗、聚合、导出封装成几个固定步骤以后遇到新数据直接套用。比如def analysis_pipeline(filepath): df pd.read_csv(filepath, encodingutf-8) df df.drop_duplicates() df[日期] pd.to_datetime(df[日期]) summary df.groupby(城市)[销售额].sum().reset_index() out filepath.replace(.csv, _summary.csv) summary.to_csv(out, indexFalse, encodingutf-8-sig) return out第三数据文件分目录管理。建议把原始数据、中间结果、最终输出分开存放避免处理过程中污染原始文件。批量任务要加日志和失败重试处理多个文件时用try...except捕获单个文件异常。第四学习路线要按需扩展。Pandas 之后下一步通常学 numpy 补充数值计算学 matplotlib 和 seaborn 做可视化学 SQL 配合数据库查询。再往后如果想做机器学习可以学 scikit-learn如果数据量确实很大可以了解 Spark 和 Dask。但不管走哪个方向Pandas 这套数据处理思维都是通用的。第五面试和项目建议偏重真实案例。如果准备数据分析岗位建议自己找一份公开数据完整跑一遍“数据清洗 - 维度分析 - 指标计算 - 可视化输出”再把结论写成简短报告这比背面试题更能体现真实能力。Pandas 入门并没有那么难难的是从“能跑代码”到“能解决业务问题”之间的练习量。2 小时足够你把核心链路跑通下一步就是找一份真实数据把文章里的案例换成自己的数据再跑一遍。建议先收藏这篇文章然后打开环境从第 10 节案例开始。
返回列表