AI_Python基础-10.Pandas Pandas 数据处理与分析标签 #Python #Pandas #数据处理 #数据分析 #Series #DataFrame学习周期2 天 | 核心目标掌握 Pandas 核心数据结构能完成数据读取、清洗、筛选、分组聚合及合并操作4.2 Pandas数据处理与分析Pandas 是基于 NumPy 开发的 Python 数据处理与分析库专为表格型数据如 Excel、CSV 文件设计提供了简洁、高效的数据操作接口。核心优势支持缺失值处理、灵活的筛选与分组、强大的合并与透视功能是数据科学、AI 开发中数据预处理的核心工具。安装与导入pip install pandasimport pandas as pd import numpy as np # Pandas 依赖 NumPy通常一起导入4.2.1 Series一维与 DataFrame二维的创建Series一维数据结构Series 由“数据值values”和“索引index”组成的一维数组类似带标签的数组。# 从列表创建默认整数索引 s1 pd.Series([10, 20, 30, 40, 50]) # 指定索引 s2 pd.Series([10, 20, 30], index[a, b, c]) # 从字典创建键为索引 s3 pd.Series({name: 张三, age: 20, gender: 男}) # 核心属性 print(s2.index) # Index([a, b, c]) print(s2.values) # [10 20 30] print(s2.dtype) # int64DataFrame二维表格DataFrame 由“行索引”、“列索引”和“数据”组成可理解为多个 Series 共享同一索引。# 方式1从字典列表创建最常用 data [ {name: 张三, age: 20, gender: 男, score: 85}, {name: 李四, age: 21, gender: 女, score: 92}, ] df1 pd.DataFrame(data) # 方式2从字典创建键为列名值为列数据 dict_data { name: [张三, 李四], age: [20, 21], score: [85, 92] } df2 pd.DataFrame(dict_data) # 方式3从 NumPy 数组创建 import numpy as np arr np.array([[1, 2], [3, 4]]) df3 pd.DataFrame(arr, columns[A, B], index[行1, 行2]) # 方式4空 DataFrame后续添加数据 df4 pd.DataFrame(columns[name, age]) # 核心属性 print(df1.shape) # (2, 4) print(df1.columns) # Index([name, age, gender, score]) print(df1.index) # RangeIndex(start0, stop2, step1) print(df1.dtypes) # 每列数据类型4.2.2 数据读取pd.read_csv()、pd.read_excel()、pd.read_json()读取 CSV 文件# 基础读取 df pd.read_csv(data.csv) # 常用参数 df pd.read_csv( data.csv, encodingutf-8, # 编码中文常用 utf-8 或 gbk sep,, # 分隔符 header0, # 第0行为列名 index_col0, # 指定列为行索引 usecols[name, age], # 只读取指定列 nrows100, # 只读前100行 na_values[无, 未知] # 将特定值视为缺失值 ) # 写入 CSV df.to_csv(output.csv, indexFalse, encodingutf-8)读取 Excel 文件需安装 openpyxl# pip install openpyxl df pd.read_excel(data.xlsx, sheet_nameSheet1) df pd.read_excel(data.xlsx, sheet_nameNone) # 读取所有 sheet返回字典 # 写入 Excel df.to_excel(output.xlsx, sheet_nameresult, indexFalse)读取 JSON 文件df pd.read_json(data.json, orientrecords) # 记录式 JSON df.to_json(output.json, orientrecords, force_asciiFalse)4.2.3 数据查看head()、info()、describe()# 预览前/后几行 df.head(10) # 前10行 df.tail(5) # 后5行 # 基本信息行数、列数、缺失值、数据类型 df.info() # 数值列统计描述均值、标准差、分位数等 df.describe() # 对分类列统计 df[category].value_counts() # 其他常用属性 df.shape # (行数, 列数) df.columns # 列名列表 df.index # 行索引4.2.4 数据清洗处理缺失值、重复值、异常值缺失值处理# 检测缺失值 df.isnull().sum() # 每列缺失值数量 # 删除缺失值 df.dropna() # 删除任何含缺失的行 df.dropna(subset[age]) # 指定列有缺失才删除 df.dropna(howall) # 全行缺失才删除 # 填充缺失值 df.fillna(0) # 用0填充 df.fillna({age: df[age].mean(), city: 未知}) df[age].fillna(df[age].median(), inplaceTrue) # 向前/向后填充 df.fillna(methodffill) # 用前一个值填充 df.fillna(methodbfill) # 用后一个值填充重复值处理# 检测重复行 df.duplicated().sum() # 删除重复行保留第一次出现 df.drop_duplicates() df.drop_duplicates(subset[name]) # 基于指定列 df.drop_duplicates(keeplast) # 保留最后一条异常值处理# 基于四分位数IQR Q1 df[age].quantile(0.25) Q3 df[age].quantile(0.75) IQR Q3 - Q1 lower Q1 - 1.5 * IQR upper Q3 1.5 * IQR df_normal df[(df[age] lower) (df[age] upper)] # 基于标准差适合正态分布 mean df[score].mean() std df[score].std() df_normal df[(df[score] mean - 3*std) (df[score] mean 3*std)] # 手动替换/删除 df.loc[df[age] 100, age] df[age].mean() df df[df[score] 0]4.2.5 数据筛选与条件过滤loc/iloc/ 布尔索引iloc按整数位置筛选左闭右开df.iloc[0] # 第一行 df.iloc[1:4, 2:5] # 行1-3列2-4 df.iloc[:, [0,2]] # 所有行第0和2列loc按标签/条件筛选包含结束标签df.loc[0] # 索引为0的行 df.loc[0:3, name:age] # 索引0-3列name到age df.loc[df[age] 25] # 条件筛选 df.loc[df[age] 25, name]布尔索引直接条件# 单条件 df[df[age] 25] # 多条件 且| 或~ 非注意括号 df[(df[age] 25) (df[city] 北京)] df[df[city].isin([北京, 上海])] df[~df[status].isin([deleted])] # 字符串方法 df[df[name].str.startswith(张)] df[df[email].str.contains(example.com)]loc与iloc对比方法筛选依据切片规则适用场景iloc整数位置左闭右开已知行列位置loc标签或条件左闭右闭已知标签或条件筛选4.2.6 分组聚合groupby()agg()# 单列分组单聚合 df.groupby(city)[age].mean() # 多列分组 df.groupby([city, gender])[score].mean() # 多个聚合函数 df.groupby(city)[age].agg([mean, std, count]) # 对不同列不同聚合 df.groupby(city).agg({ age: mean, score: [min, max], name: count }) # 命名聚合推荐 result df.groupby(city).agg( avg_age(age, mean), max_score(score, max), total(name, count) ) # 分组筛选filter df.groupby(class).filter(lambda x: x[score].mean() 85) # 重置索引 df.groupby(city)[age].mean().reset_index()4.2.7 数据合并concat、merge类似 SQL 的 joinconcat拼接# 垂直拼接行追加 df1 pd.DataFrame({A: [1,2], B: [3,4]}) df2 pd.DataFrame({A: [5,6], B: [7,8]}) pd.concat([df1, df2], axis0, ignore_indexTrue) # 水平拼接列合并 df3 pd.DataFrame({C: [9,10]}) pd.concat([df1, df3], axis1)merge关联类似 SQL joinleft pd.DataFrame({id: [1,2,3], name: [A,B,C]}) right pd.DataFrame({id: [1,2,4], score: [85,92,78]}) # 内连接默认 pd.merge(left, right, onid, howinner) # 左连接、右连接、外连接 pd.merge(left, right, onid, howleft) pd.merge(left, right, onid, howright) pd.merge(left, right, onid, howouter) # 不同列名连接 pd.merge(left, right, left_onid, right_onuser_id) # 多列连接 pd.merge(df1, df2, on[key1, key2]) # 处理重复列名 pd.merge(df1, df2, onid, suffixes(_left, _right))4.2.8 透视表pivot_table# 基础透视表 pivot pd.pivot_table( df, values销售额, index城市, # 行分组 columns产品, # 列分组 aggfuncsum # 聚合函数 ) # 多值、多聚合 pivot2 pd.pivot_table( df, values[销售额, 数量], index城市, columns产品, aggfunc{销售额: sum, 数量: mean} ) # 添加边际总计 pivot3 pd.pivot_table( df, values销售额, index城市, columns产品, aggfuncsum, marginsTrue, margins_name总计 ) # 多级行索引 pivot4 pd.pivot_table( df, values销售额, index[城市, 产品], aggfuncsum ) # 重置透视表索引 pivot4.reset_index() 学习资料Obsidian 可直接收藏官方文档Pandas 官方中文文档Pandas API Reference中文教程菜鸟教程 - PandasPandas 入门教程十分钟书籍推荐《利用 Python 进行数据分析》Wes McKinney 著视频推荐莫烦 Python - Pandas 教程 学习建议2 天计划第 1 天掌握 Series/DataFrame 创建、数据读取、数据查看head/info/describe、数据清洗缺失值、重复值、异常值。第 2 天学习数据筛选loc/iloc/布尔索引、分组聚合groupby agg、数据合并concat/merge、透视表pivot_table。✅ 核心要点总结Series一维带标签数组DataFrame二维表格类似 Excel。数据读取read_csv、read_excel、read_json注意编码和参数。数据清洗dropna/fillna处理缺失值drop_duplicates去重条件过滤处理异常值。筛选loc标签/条件、iloc位置、布尔索引df[条件]。分组聚合groupby()agg()或aggregate()可自定义函数。合并concat拼接行/列merge按键连接内/左/右/外。透视表pivot_table实现数据透视支持多级索引和边际统计。练习题自测读取一个 CSV 文件可自己创建查看其基本信息处理缺失值填充均值并删除重复行。筛选出某列大于某个阈值的所有行并只保留指定的几列。使用groupby计算不同类别下的平均值、最大值和计数。将两个 DataFrame 按照某列进行左连接并处理列名冲突。创建一个销售数据表使用pivot_table统计每个销售员、每个产品的总销售额和平均数量。建议使用 Jupyter Notebook 或 VS Code 逐行运行示例观察输出结果。