
前言Pandas 是基于 NumPy 构建的 Python 数据分析核心库它提供了高效、易用的数据结构Series、DataFrame和数据分析工具能轻松处理结构化数据如表格、CSV 文件、Excel 表格等。相比 NumPy 专注于数值计算Pandas 更擅长数据清洗、筛选、转换和分析是数据分析、机器学习预处理阶段的必备工具。本文将从 Pandas 核心数据结构、数据选择、值的设置、缺失值处理、文件导入导出五个维度带你快速掌握 Pandas 基础用法适合刚接触 Pandas 的新手入门。1. Pandas 基本介绍两大核心数据结构使用 Pandas 前需先导入库约定俗成用pd作为别名import pandas as pd import numpy as np # 搭配 Numpy 生成测试数据Pandas 的核心是两种数据结构Series一维序列和DataFrame二维表格二者可覆盖绝大多数结构化数据处理场景。1.1 Series一维带标签的数组Series 是一维数据结构由值values和索引index组成可理解为 “带标签的一维数组”支持整数 / 字符串等多种索引类型。1.1.1 创建 Series# 1. 基础创建默认整数索引 s1 pd.Series([1, 3, 5, np.nan, 6, 8]) print(基础 Series\n, s1) # 输出 # 0 1.0 # 1 3.0 # 2 5.0 # 3 NaN # 4 6.0 # 5 8.0 # dtype: float64 # 2. 指定自定义索引 s2 pd.Series([10, 20, 30], index[a, b, c]) print(\n自定义索引 Series\n, s2) # 输出 # a 10 # b 20 # c 30 # dtype: int64 # 3. 从字典创建字典键为索引值为数据 s3 pd.Series({北京: 100, 上海: 200, 广州: 300}) print(\n字典创建 Series\n, s3) # 输出 # 北京 100 # 上海 200 # 广州 300 # dtype: int641.1.2 Series 核心属性print(Series 值, s2.values) # 输出[10 20 30] print(Series 索引, s2.index) # 输出Index([a, b, c], dtypeobject) print(Series 数据类型, s2.dtype) # 输出int64 print(Series 长度, len(s2)) # 输出31.2 DataFrame二维带标签的表格DataFrame 是二维表格型数据结构由行索引、列索引和数据组成可理解为 “多个共享索引的 Series 组成的字典”是 Pandas 最常用的数据结构。1.2.1 创建 DataFrame# 1. 基础创建指定数据、行索引、列索引 # 生成日期索引6行 dates pd.date_range(20260101, periods6) # 创建6行4列的DataFrame数据为随机数行索引为日期列索引为A/B/C/D df pd.DataFrame(np.random.randn(6, 4), indexdates, columns[A, B, C, D]) print(基础 DataFrame\n, df) # 输出示例 A B C D 2026-01-01 -0.054665 -0.686097 1.546265 0.408167 2026-01-02 -0.349363 -0.454368 -0.924799 -0.898330 2026-01-03 2.440441 1.090445 0.689678 -1.631749 2026-01-04 0.559605 -0.340962 0.722296 -0.558562 2026-01-05 1.378885 -1.215384 0.691255 2.209100 2026-01-06 -0.353967 -1.918719 0.070621 -0.831667 # 2. 从字典创建字典键为列名值为列数据 df2 pd.DataFrame({ 姓名: [张三, 李四, 王五], 年龄: [20, 25, 30], 城市: [北京, 上海, 广州] }) print(\n字典创建 DataFrame\n, df2) # 输出 # 姓名 年龄 城市 # 0 张三 20 北京 # 1 李四 25 上海 # 2 王五 30 广州1.2.2 DataFrame 核心属性print(DataFrame 形状行×列, df2.shape) # 输出(3, 3) print(DataFrame 列名, df2.columns) # 输出Index([姓名, 年龄, 城市], dtypeobject) print(DataFrame 行索引, df2.index) # 输出RangeIndex(start0, stop3, step1) print(DataFrame 前2行\n, df2.head(2)) # 查看前n行默认5行 print(DataFrame 后2行\n, df2.tail(2)) # 查看后n行默认5行 print(DataFrame 基本统计信息\n, df2.describe()) # 数值列的统计信息计数、均值、标准差等输出结果为2. Pandas 选择数据Pandas 提供多种灵活的索引方式选择数据核心分为切片索引、loc标签索引、iloc位置索引、ix混合索引、Boolean indexing布尔索引五类覆盖所有数据选择场景。2.1 切片索引[] 基础切片切片索引是最基础的选择方式主要用于按行切片或按列名选列不支持复杂的行 列组合选择。import pandas as pd import numpy as np# 1. 基础创建指定数据、行索引、列索引 dates pd.date_range(20260101, periods6) df pd.DataFrame(np.arange(24).reshape(6,4), indexdates, columns[A, B, C, D]) df2 pd.DataFrame({ 姓名: [张三, 李四, 王五], 年龄: [20, 25, 30], 城市: [北京, 上海, 广州] }) print(df) # 1. 选列直接传入列名单列/多列 col_A df[A] # 选单列 col_name_age df2[[姓名, 年龄]] # 选多列传入列表 print(【切片索引】选单列A\n, col_A.head(3))#只查看col_A的前三行 print(\n【切片索引】选多列姓名年龄\n, col_name_age) # 2. 选行按整数位置切片左闭右开 row_slice_1 df[0:3] # 选前3行 row_slice_2 df[2026-01-01:2026-01-03] # 日期索引支持标签切片 print(\n【切片索引】按位置选前3行\n, row_slice_1) print(\n【切片索引】按标签切片选行\n, row_slice_2) # 注意切片索引不能同时选行和列如 df[0:2, A] 会报错输出结果2.2 loc标签索引loc是纯标签驱动的索引方式语法为df.loc[行标签, 列标签]支持单标签、多标签、标签切片是最常用的精准索引方式。import pandas as pd import numpy as np# 1. 基础创建指定数据、行索引、列索引 dates pd.date_range(20260101, periods6) df pd.DataFrame(np.arange(24).reshape(6,4), indexdates, columns[A, B, C, D]) df2 pd.DataFrame({ 姓名: [张三, 李四, 王五], 年龄: [20, 25, 30], 城市: [北京, 上海, 广州] }) print(df) # 1. 单行单列单个单元格 cell_loc df.loc[2026-01-01, A] print(【loc】单行单列, cell_loc) # 2. 单行多列 row_loc_multi_col df.loc[2026-01-01, [A, B]] print(\n【loc】单行多列\n, row_loc_multi_col) # 3. 多行多列标签切片 multi_loc df.loc[2026-01-01:2026-01-04, A:C] # 切片包含结束标签 print(\n【loc】多行多列标签切片\n, multi_loc) # 4. 对默认整数索引的df2使用loc df2_loc df2.loc[1, 城市] # 第2行索引1的城市列 print(\n【loc】df2单行单列, df2_loc)输出结果为2.3 iloc位置索引iloc是纯整数位置驱动的索引方式语法为df.iloc[行位置, 列位置]位置从 0 开始与 Python 列表索引逻辑完全一致。import pandas as pd import numpy as np# 1. 基础创建指定数据、行索引、列索引 dates pd.date_range(20260101, periods6) df pd.DataFrame(np.arange(24).reshape(6,4), indexdates, columns[A, B, C, D]) df2 pd.DataFrame({ 姓名: [张三, 李四, 王五], 年龄: [20, 25, 30], 城市: [北京, 上海, 广州] }) print(df) # 1. 单行单列单个单元格 cell_iloc df.iloc[0, 0] # 第1行第1列 print(【iloc】单行单列, cell_iloc) # 2. 单行多列位置切片 row_iloc_multi_col df.iloc[0, 1:3] # 第1行第2-3列左闭右开 print(\n【iloc】单行多列\n, row_iloc_multi_col) # 3. 多行单列多位置 multi_row_iloc_col df.iloc[[0, 2], 3] # 第1、3行第4列 print(\n【iloc】多行单列\n, multi_row_iloc_col) # 4. 多行多列切片多位置 multi_iloc df.iloc[0:3, [0, 2]] # 第1-3行第1、3列 print(\n【iloc】多行多列\n, multi_iloc) # 5. 对df2使用iloc df2_iloc df2.iloc[2, 0] # 第3行第1列姓名 print(\n【iloc】df2单行单列, df2_iloc)输出结果为2.4 ix混合索引已废弃ix是早期 Pandas 提供的混合索引方式可同时支持标签和位置索引但因易产生歧义Pandas 1.0 已废弃仅作了解。df采用上文的定义# 注意Pandas 1.0 中 ix 已被移除建议优先用 loc/iloc # 示例仅兼容低版本 # df_ix df.ix[0, A] # 行用位置0列用标签A # print(【ix】混合索引, df_ix) # 替代方案如需混合索引可分步操作 # 1. 先按位置找行标签再用loc row_label df.index[0] # 获取第1行的标签 df_mix df.loc[row_label, A] print(【混合索引替代方案】, df_mix)2.5 Boolean indexing布尔索引布尔索引是按条件筛选数据的核心方式通过生成与数据行数一致的布尔数组筛选出True对应的行支持单条件、多条件组合。import pandas as pd import numpy as np# 1. 基础创建指定数据、行索引、列索引 dates pd.date_range(20260101, periods6) df pd.DataFrame(np.arange(24).reshape(6,4), indexdates, columns[A, B, C, D]) df2 pd.DataFrame({ 姓名: [张三, 李四, 王五], 年龄: [20, 25, 30], 城市: [北京, 上海, 广州] }) print(df) # 1. 单条件筛选 cond1 df[A] 16 # 生成A列16的布尔数组 df_cond1 df[cond1] print(【布尔索引】单条件A16\n, df_cond1) # 2. 多条件筛选且|或~非条件需用括号包裹 cond2 (df[A] 0) (df[B] 10) # A0 且 B10 df_cond2 df[cond2] print(\n【布尔索引】多条件A0 且 B10\n, df_cond2) # 3. 对df2的字符串列做条件筛选 df2_cond df2[df2[城市] 北京] print(\n【布尔索引】字符串条件城市北京\n, df2_cond) # 4. 结合loc的布尔索引筛选行指定列 df_cond_loc df.loc[df[A] 8, [A, C]] print(\n【布尔索引loc】筛选行并指定列\n, df_cond_loc) 输出结果为3. Pandas 设置值数据分析中常需修改数据值Pandas 支持 “按标签、按位置、按条件” 设置值操作直观且高效。3.1 按标签 / 位置设置值import pandas as pd import numpy as np# 1. 基础创建指定数据、行索引、列索引 dates pd.date_range(20260101, periods6) df pd.DataFrame(np.arange(24).reshape(6,4), indexdates, columns[A, B, C, D]) df2 pd.DataFrame({ 姓名: [张三, 李四, 王五], 年龄: [20, 25, 30], 城市: [北京, 上海, 广州] }) print(df) # 基于 df2 示例姓名/年龄/城市表格 df3 df2.copy() # 复制数据避免修改原数据 # 1. 按列设置值整列赋值 df3[年龄] [21, 26, 31] # 批量修改「年龄」列 print(修改整列值\n, df3) # 2. 按标签设置单行单列 df3.loc[1, 城市] 深圳 # 将第2行「城市」列改为深圳 print(\n按标签修改单元格\n, df3) # 3. 按位置设置单行单列 df3.iloc[2, 1] 32 # 将第3行第2列年龄改为32 print(\n按位置修改单元格\n, df3) # 4. 按行设置多列值 df3.loc[0, [姓名, 城市]] [赵六, 杭州] print(\n按行修改多列值\n, df3)输出结果为3.2 按条件设置值import pandas as pd import numpy as np# 1. 基础创建指定数据、行索引、列索引 dates pd.date_range(20260101, periods6) df pd.DataFrame(np.arange(24).reshape(6,4), indexdates, columns[A, B, C, D]) df2 pd.DataFrame({ 姓名: [张三, 李四, 王五], 年龄: [20, 25, 30], 城市: [北京, 上海, 广州] }) print(df) # 基于 df日期索引的数值表格 df4 df.copy() # 1. 将 A 列中大于0的值改为0 df4.loc[df4[A] 0, A] 0 print(按条件修改 A 列值\n, df4) # 2. 新增列并按条件赋值 df4[E] np.nan # 新增空列 E df4.loc[df4[B] 6, E] 1 # B列6的行E列设为1 df4.loc[df4[B] 6, E] 0 # B列≤6的行E列设为0 print(\n新增列并按条件赋值\n, df4)输出结果4. Pandas 处理数据丢失实际数据中常存在缺失值NaN/NonePandas 提供dropna删除缺失值、fillna填充缺失值、isna检测缺失值等方法处理。4.1 检测缺失值isna# 创建含缺失值的测试数据 df5 pd.DataFrame({ A: [1, np.nan, 3], B: [4, 5, np.nan], C: [7, 8, 9] }) print(原始含缺失值数据\n, df5) # 1. 检测缺失值返回布尔矩阵 print(\n缺失值检测True缺失\n, df5.isna()) # 2. 统计每列缺失值数量 print(\n每列缺失值数量\n, df5.isna().sum())输出结果4.2 删除缺失值dropnadropna(axis0, howany, threshNone, subsetNone, inplaceFalse)关键参数说明重点参数取值 / 默认值作用axis0默认/10 删除行含缺失值的行1 删除列含缺失值的列howany/allany默认 行 / 列有任意缺失值就删除all 行 / 列全为缺失值才删除threshNone默认整数要求行 / 列至少有 N 个非缺失值才保留否则删除subsetNone默认列表指定仅检查某些列 / 行的缺失值仅对 axis0/1 生效inplaceFalse默认True 直接修改原数据False 返回新数据推荐import pandas as pd import numpy as np # 创建含缺失值的测试数据 df5 pd.DataFrame({ A: [1, np.nan, 3], B: [4, 5, np.nan], C: [7, 8, 9] }) # 1. 删除包含缺失值的行默认 howany df5_drop_row df5.dropna(axis0, howany) # axis0行howany有缺失就删 print(删除含缺失值的行\n, df5_drop_row) # 2. 删除包含缺失值的列 df5_drop_col df5.dropna(axis1, howany) # axis1列 print(\n删除含缺失值的列\n, df5_drop_col) # 3. 仅删除所有值都缺失的行howall df5_drop_all df5.dropna(axis0, howall) print(\n仅删除全为缺失值的行\n, df5_drop_all)输出结果4.3 填充缺失值fillnafillna()核心语法与参数fillna(valueNone, methodNone, axis0, inplaceFalse, limitNone, downcastNone)关键参数说明重点参数取值 / 默认值作用valueNone默认填充值可以是固定值如 0、 未知 、字典按列填充不同值、Series/DataFramemethodNone默认填充方式ffill向前填充/bfill向后填充/pad同 ffill/backfill同 bfillaxisNone默认填充轴0按列填充默认/1按行填充inplaceFalse默认True 直接修改原数据False 返回新数据推荐limitNone默认整数限制填充的最大数量避免一次性填充所有缺失值实战示例结合 DataFrame先创建包含缺失值的测试数据import pandas as pd import numpy as np # 构建测试数据 df pd.DataFrame({ A: [1, np.nan, 3, None, 5], B: [np.nan, 2, 3, 4, 5], C: [1, 2, np.nan, np.nan, np.nan], D: [a, None, c, None, e] }) print(原始数据) print(df)原始数据输出A B C D 0 1.0 NaN 1.0 a 1 NaN 2.0 2.0 None 2 3.0 3.0 NaN c 3 NaN 4.0 NaN None 4 5.0 5.0 NaN e示例 1固定值填充最基础用单一值填充所有缺失值适合所有列缺失值填充规则一致的场景。# 所有缺失值填充为 0 df_fill_0 df.fillna(0) print(\n所有缺失值填充为 0) print(df_fill_0) # 字符串列填充为 未知数值列填充为 -1先复制避免修改原数据 df_fill_custom df.copy() df_fill_custom[A] df_fill_custom[A].fillna(-1) df_fill_custom[B] df_fill_custom[B].fillna(-1) df_fill_custom[C] df_fill_custom[C].fillna(-1) df_fill_custom[D] df_fill_custom[D].fillna(未知) print(\n数值列填-1字符串列填未知) print(df_fill_custom)输出关键部分所有缺失值填充为 0 A B C D 0 1.0 0.0 1.0 a 1 0.0 2.0 2.0 0 2 3.0 3.0 0.0 c 3 0.0 4.0 0.0 0 4 5.0 5.0 0.0 e 数值列填-1字符串列填未知 A B C D 0 1.0 -1.0 1.0 a 1 -1.0 2.0 2.0 未知 2 3.0 3.0 -1.0 c 3 -1.0 4.0 -1.0 未知 4 5.0 5.0 -1.0 e示例 2按列填充不同值字典传参用字典指定每列的填充值适合不同列填充规则不同的场景。# 字典格式{列名: 填充值} df_fill_dict df.fillna({ A: 0, B: df[B].mean(), # 用B列的均值填充 C: df[C].median(),# 用C列的中位数填充 D: 缺失 }) print(\n按列填充不同值字典) print(df_fill_dict)输出按列填充不同值字典 A B C D 0 1.0 3.5 1.0 a 1 0.0 2.0 2.0 缺失 2 3.0 3.0 1.5 c 3 0.0 4.0 1.5 缺失 4 5.0 5.0 1.5 e示例 3向前 / 向后填充method用相邻的非缺失值填充适合时序数据、连续数据场景。# 向前填充ffill用前一行的非缺失值填充 df_ffill df.fillna(methodffill) print(\n向前填充ffill) print(df_ffill) # 向后填充bfill用后一行的非缺失值填充限制最多填充1个 df_bfill_limit df.fillna(methodbfill, limit1) print(\n向后填充bfill限制最多填充1个) print(df_bfill_limit)输出关键部分向前填充ffill A B C D 0 1.0 NaN 1.0 a 1 1.0 2.0 2.0 a 2 3.0 3.0 2.0 c 3 3.0 4.0 2.0 c 4 5.0 5.0 2.0 e 向后填充bfill限制最多填充1个 A B C D 0 1.0 2.0 1.0 a 1 3.0 2.0 2.0 c 2 3.0 3.0 NaN c 3 5.0 4.0 NaN e 4 5.0 5.0 NaN e示例 4直接修改原数据inplaceTrue# 复制原数据避免修改源数据 df_copy df.copy() # 直接修改原数据无返回值 df_copy.fillna(0, inplaceTrue) print(\ninplaceTrue 直接修改原数据) print(df_copy)5. Pandas 导入导出Pandas 支持读写多种格式的文件CSV、Excel、JSON 等是数据导入导出的核心工具以下为最常用的 CSV 和 Excel 操作。5.1 导入数据读取文件5.1.1 读取 CSV 文件pd.read_csv()核心语法与参数基础语法import pandas as pd # 最基础用法 df pd.read_csv(文件路径/文件名.csv) # 完整语法含核心参数 df pd.read_csv( filepath_or_buffer, # 必填文件路径/URL sep,, # 分隔符 headerinfer, # 表头行 index_colNone, # 索引列 usecolsNone, # 读取指定列 dtypeNone, # 指定列的数据类型 na_valuesNone, # 识别为缺失值的字符 skiprowsNone, # 跳过指定行 nrowsNone, # 读取前N行 encodingNone, # 文件编码 low_memoryTrue # 内存优化 )关键参数详解新手必掌握参数常用取值 / 默认值核心作用filepath_or_buffer字符串必填本地文件路径如data.csv/C:/data/test.csv或网络 URLsep,默认分隔符逗号,、制表符\t、空格、竖线|等正则如\s匹配多空格headerinfer默认表头行0第一行做表头、None无表头列名用 0/1/2...、2第三行做表头index_colNone默认索引列0第一列做索引、列名指定列名做索引、[0,1]多级索引usecolsNone默认读取指定列[列1,列2]或[0,2]仅读取第 1、3 列dtypeNone默认指定列类型{ID:str, 年龄:int}避免数字列被识别为字符串na_valuesNone默认自定义缺失值[-, 未知, N/A]这些字符会被识别为 NaNskiprowsNone默认跳过行2跳过前 2 行、[0,3]跳过第 1、4 行、lambda x: x%20跳过偶数行nrowsNone默认仅读取前 N 行1000读取前 1000 行适合大文件预览encodingNone默认文件编码utf-8通用、gbk中文 Windows 文件、gb2312实战案例注意data1.csv和data2.csv文件需要自己创建import pandas as pd df_1 pd.read_csv(data1.csv) df_2 pd.read_csv(data2.csv,encodinggbk,headerNone) #headerNone表示不添加标题 print(df_2)输出结果5.1.2 读取 Excel 文件读取 Excel 需要安装openpyxl读 xlsx/xlrd读 xlspip install openpyxl xlrd# 核心语法pd.read_excel(文件路径, 可选参数) # 示例读取本地 Excel 文件 # df_excel pd.read_excel( # data.xlsx, # 文件路径 # sheet_nameSheet1, # 工作表名 # header0, # 表头行 # index_colNone # 索引列 # ) # 测试用创建临时Excel文件并读取 df_test.to_excel(test.xlsx, sheet_name测试表, indexFalse) df_excel pd.read_excel(test.xlsx, sheet_name测试表) print(\n读取Excel文件\n, df_excel)实战案例5.2 导出数据写入文件5.2.1 写入 CSV 文件# 核心语法df.to_csv(文件路径, 可选参数) df_csv.to_csv( output.csv, # 输出文件路径 indexFalse, # 不写入行索引关键避免多余列 encodingutf-8 # 编码 ) print(CSV文件导出完成)实战案例当运行了图片中代码时会生成文件“导出.csv”,可以观察到其在左下角具体展示5.2.2 写入 Excel 文件# 保存为 Excel df.to_excel( output.xlsx, # 输出文件路径 sheet_name结果表, # 自定义工作表名 indexFalse, # ✅ 必加 headerTrue, na_rep空值, freeze_panes(1, 0) # 冻结首行方便查看 ) print(Excel 文件已成功保存到 output.xlsx)总结Pandas 核心数据结构Series一维带标签、DataFrame二维表格是处理结构化数据的基础数据选择[]选列、loc按标签选、iloc按位置选、布尔索引按条件选设置值支持按标签 / 位置 / 条件赋值批量赋值可利用 “广播” 特性缺失值处理先通过isna检测再用dropna删除或fillna填充均值 / 固定值 / 前后值导入导出核心掌握read_csv/to_csv、read_excel/to_excel注意编码和索引参数。