Python Pandas 使用指南:数据分析的瑞士军刀
Python Pandas 使用指南数据分析的瑞士军刀作者书到用时方恨少发布日期2026年4月4日阅读时长约25分钟 写在前面在 Python 数据生态中Pandas如同一位全能的工匠——它基于 NumPy 构建提供了DataFrame和Series两种核心数据结构让表格数据的清洗、转换、分析和可视化变得异常优雅。无论是处理 CSV、Excel、SQL 数据库还是进行时间序列分析、分组聚合、数据透视Pandas 都能以直观的语法让你事半功倍。如果说 NumPy 是数值计算的基石那么 Pandas 就是数据分析的利器。它解决了数据处理中 80% 的痛点缺失值处理、行列标签、多级索引、数据合并、窗口函数……无论你是数据科学家、金融分析师还是运营人员Pandas 都将是你日常工作中最亲密的伙伴。让我们一起走进这个强大的库掌握数据操控的艺术1. Pandas 是什么为什么需要它1.1 从 NumPy 到 PandasNumPy 擅长数值运算但缺乏对异质数据如混合类型列、缺失值、标签索引、时间序列的原生支持。Pandas 填补了这一空白标签化索引通过行索引和列名定位数据像 Excel 一样直观。缺失值处理内置NaN概念并提供dropna、fillna等丰富方法。数据对齐不同来源的数据按索引自动对齐无需手动循环。强大的 IO 能力支持 CSV、Excel、JSON、SQL、HTML、Parquet 等数十种格式。1.2 核心数据结构结构描述类比Series一维带标签数组Excel 中的一列DataFrame二维带标签的表格结构Excel 工作表importpandasaspdimportnumpyasnp# Seriesspd.Series([1,3,5,np.nan,8],index[a,b,c,d,e])# DataFramedfpd.DataFrame({姓名:[张三,李四,王五],年龄:[25,30,35],薪资:[8000,12000,15000]})2. 快速入门创建与读取数据2.1 创建 DataFrame# 从字典创建dfpd.DataFrame({A:[1,2,3],B:[4,5,6]})# 从 NumPy 数组创建arrnp.random.randn(4,3)df2pd.DataFrame(arr,columns[X,Y,Z],index[r1,r2,r3,r4])# 从列表的列表创建df3pd.DataFrame([[1,a],[2,b]],columns[num,letter])2.2 读取外部数据最常用# CSVdfpd.read_csv(data.csv,encodingutf-8,parse_dates[日期])# Excel需要 openpyxl 或 xlrddfpd.read_excel(data.xlsx,sheet_nameSheet1)# SQLimportsqlite3 connsqlite3.connect(database.db)dfpd.read_sql(SELECT * FROM table,conn)# JSONdfpd.read_json(data.json)# 保存df.to_csv(output.csv,indexFalse)df.to_excel(output.xlsx,indexFalse)3. 数据探索与查看dfpd.read_csv(titanic.csv)# 快速概览df.head(10)# 前10行df.tail()# 后5行df.info()# 列类型、非空计数、内存df.describe()# 数值列的统计摘要df.shape# (行, 列)df.columns# 列名列表df.dtypes# 每列数据类型# 统计df[Age].mean()df[Survived].value_counts()df.corr()# 相关系数矩阵4. 数据选择与过滤Pandas 提供了多种数据选择方式推荐使用.loc和.iloc。4.1 按列选择df[Name]# 单列 - Seriesdf[[Name,Age]]# 多列 - DataFrame4.2 按行选择# 标签索引包含末尾df.loc[5:10,[Name,Age]]# 整数位置索引不包含末尾df.iloc[5:11,[0,2]]# 条件过滤df[df[Age]30]df[(df[Age]30)(df[Sex]female)]df[df[Name].str.contains(Brown)]# query 方法更简洁df.query(Age 30 and Sex female)4.3 修改数据# 新增列df[Age_Group]np.where(df[Age]18,Child,Adult)# 修改某列df.loc[df[Age]60,Age_Group]Senior# 删除列df.drop(Cabin,axis1,inplaceTrue)5. 数据清洗缺失值与重复值5.1 缺失值处理# 检测缺失值df.isnull().sum()# 每列缺失数量df[Age].isna().sum()# 删除缺失行df.dropna(subset[Age,Embarked])# 指定列中任何缺失则删除行# 填充缺失值df[Age].fillna(df[Age].median(),inplaceTrue)df[Embarked].fillna(S,inplaceTrue)# 向前/向后填充df.fillna(methodffill)5.2 重复值处理df.duplicated().sum()# 重复行数df.drop_duplicates(subset[PassengerId],keepfirst)6. 数据转换与运算6.1 列运算与 apply# 向量化运算df[Age]df[Age].astype(int)df[Fare_Dollar]df[Fare]*1.1# 假设加10%手续费# apply 映射defclassify_age(age):ifage18:returnChildelifage60:returnAdultelse:returnSeniordf[Age_Category]df[Age].apply(classify_age)# 使用 lambdadf[Name_len]df[Name].apply(lambdax:len(x))# applymap 对整个 DataFrame 每个元素df[[Age,Fare]].applymap(lambdax:round(x,1))6.2 字符串方法str 访问器df[Name].str.upper()df[Name].str.contains(Mr,naFalse)df[Ticket].str.extract(r(\d))# 正则提取6.3 日期时间处理df[Date]pd.to_datetime(df[Date])df[Year]df[Date].dt.year df[Month]df[Date].dt.month_name()df[Weekday]df[Date].dt.dayofweek7. 分组聚合与透视表7.1 groupby# 单列分组聚合df.groupby(Pclass)[Fare].mean()# 多列分组 多种聚合df.groupby([Pclass,Sex])[Survived].agg([mean,count,sum])# 对多列使用不同函数df.groupby(Pclass).agg({Fare:mean,Age:[median,std],Survived:sum})# 自定义聚合函数defrange_func(x):returnx.max()-x.min()df.groupby(Pclass)[Fare].agg(range_func)7.2 透视表与交叉表# 类似 Excel 数据透视表pd.pivot_table(df,valuesFare,indexPclass,columnsSex,aggfuncmean)# 交叉表频数统计pd.crosstab(df[Pclass],df[Survived],marginsTrue)8. 合并与连接8.1 concat堆叠# 垂直拼接行追加df1pd.DataFrame({A:[1,2],B:[3,4]})df2pd.DataFrame({A:[5,6],B:[7,8]})pd.concat([df1,df2],axis0,ignore_indexTrue)# 水平拼接列合并pd.concat([df1,df2],axis1)8.2 merge类似 SQL JOINcustomerspd.DataFrame({id:[1,2,3],name:[A,B,C]})orderspd.DataFrame({cust_id:[1,1,2],amount:[100,200,150]})# 内连接pd.merge(customers,orders,left_onid,right_oncust_id,howinner)# 左连接、右连接、外连接howleft,right,outer8.3 join基于索引合并df_leftdf1.set_index(key)df_rightdf2.set_index(key)df_left.join(df_right,howinner)9. 时间序列分析# 创建日期范围datespd.date_range(2025-01-01,periods100,freqD)# 设置时间索引df[Date]pd.to_datetime(df[Date])df.set_index(Date,inplaceTrue)# 重采样降采样/升采样df.resample(M).mean()# 月均df.resample(W).sum()# 周总和# 移动窗口df[rolling_mean]df[Value].rolling(window7).mean()# 滞后与差分df[Shifted]df[Value].shift(1)df[Diff]df[Value].diff(1)10. 实战案例案例一电商订单数据分析# 读取数据orderspd.read_csv(orders.csv,parse_dates[order_date])orders[order_month]orders[order_date].dt.to_period(M)# 月度销售额monthly_salesorders.groupby(order_month)[amount].sum()# 用户复购率user_ordersorders.groupby(user_id)[order_id].nunique()repeated_usersuser_orders[user_orders1].count()repeat_raterepeated_users/user_orders.count()案例二处理缺失值的高级技巧# 按组填充缺失值用同类别的均值df[Age]df.groupby(Pclass)[Age].transform(lambdax:x.fillna(x.median()))# 插值法填充时间序列df[Value].interpolate(methodlinear,inplaceTrue)案例三拆分一列为多行explodedfpd.DataFrame({id:[1,2],items:[[apple,banana],[orange]]})df_explodeddf.explode(items)# 每个列表元素变成单独一行11. ⚠️ 常见陷阱与注意事项11.1 视图与副本SettingWithCopyWarning# 错误方式可能产生警告df[df[Age]30][NewCol]1# 链式索引可能无效# 正确方式df.loc[df[Age]30,NewCol]111.2 忘记 inplace 参数许多方法如drop、fillna默认返回新 DataFrame需赋值或设置inplaceTrue。11.3 数据类型误判read_csv可能将日期读为字符串用parse_dates参数或pd.to_datetime转换。11.4 内存占用处理大文件时使用分块读取chunkspd.read_csv(large.csv,chunksize10000)forchunkinchunks:process(chunk)11.5 避免显式循环能用向量化、apply、groupby就尽量别用for循环否则效率极低。12. Pandas vs 其他工具特性PandasSQLExcelNumPy数据量中等内存级海量磁盘级小~1M行中等缺失值✅ 原生NULL空单元格❌标签索引✅ 强大列名行号行列号整数索引分组聚合✅ 灵活GROUP BY透视表需手动时间序列✅ 丰富有限有限一般学习曲线中等中等低低选型建议数据清洗、探索、中小规模分析 →Pandas海量数据、复杂查询 →SQL 数据库简单统计、报表 →Excel纯数值计算、深度学习数据预处理 →NumPy Pandas13. 总结通过本文我们系统学习了 Pandas 的核心功能✅数据结构Series 和 DataFrame✅数据 IO读写 CSV、Excel、SQL、JSON 等✅数据查看head、info、describe✅选择与过滤loc、iloc、布尔索引、query✅数据清洗缺失值处理、重复值、类型转换✅数据转换apply、字符串方法、日期处理✅分组聚合groupby、agg、pivot_table✅合并拼接concat、merge、join✅时间序列重采样、滑动窗口、偏移✅实战案例电商分析、缺失值插补、explode 拆分✅注意事项SettingWithCopy、内存、分块读取Pandas 是数据分析师和科学家不可或缺的工具。掌握它你将能高效地完成从数据清洗到洞察产出的全流程。纸上得来终觉浅绝知此事要躬行——打开 Jupyter Notebook开始你的 Pandas 实践之旅吧如果你有独特的 Pandas 技巧或踩过的坑欢迎在评论区分享交流我们下篇见