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(start=0, stop=2, step=1) 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', encoding='utf-8', # 编码(中文常用 utf-8 或 gbk) sep=',', # 分隔符 header=0, # 第0行为列名 index_col=0, # 指定列为行索引 usecols=['name', 'age'], # 只读取指定列 nrows=100, # 只读前100行 na_values=['无', '未知'] # 将特定值视为缺失值 ) # 写入 CSV df.to_csv('output.csv', index=False, encoding='utf-8')读取 Excel 文件(需安装 openpyxl)
# pip install openpyxl df = pd.read_excel('data.xlsx', sheet_name='Sheet1') df = pd.read_excel('data.xlsx', sheet_name=None) # 读取所有 sheet,返回字典 # 写入 Excel df.to_excel('output.xlsx', sheet_name='result', index=False)读取 JSON 文件
df = pd.read_json('data.json', orient='records') # 记录式 JSON df.to_json('output.json', orient='records', force_ascii=False)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(how='all') # 全行缺失才删除 # 填充缺失值 df.fillna(0) # 用0填充 df.fillna({'age': df['age'].mean(), 'city': '未知'}) df['age'].fillna(df['age'].median(), inplace=True) # 向前/向后填充 df.fillna(method='ffill') # 用前一个值填充 df.fillna(method='bfill') # 用后一个值填充重复值处理
# 检测重复行 df.duplicated().sum() # 删除重复行(保留第一次出现) df.drop_duplicates() df.drop_duplicates(subset=['name']) # 基于指定列 df.drop_duplicates(keep='last') # 保留最后一条异常值处理
# 基于四分位数(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 的 join)
concat(拼接)
# 垂直拼接(行追加) df1 = pd.DataFrame({'A': [1,2], 'B': [3,4]}) df2 = pd.DataFrame({'A': [5,6], 'B': [7,8]}) pd.concat([df1, df2], axis=0, ignore_index=True) # 水平拼接(列合并) df3 = pd.DataFrame({'C': [9,10]}) pd.concat([df1, df3], axis=1)merge(关联,类似 SQL join)
left = 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, on='id', how='inner') # 左连接、右连接、外连接 pd.merge(left, right, on='id', how='left') pd.merge(left, right, on='id', how='right') pd.merge(left, right, on='id', how='outer') # 不同列名连接 pd.merge(left, right, left_on='id', right_on='user_id') # 多列连接 pd.merge(df1, df2, on=['key1', 'key2']) # 处理重复列名 pd.merge(df1, df2, on='id', suffixes=('_left', '_right'))4.2.8 透视表:pivot_table
# 基础透视表 pivot = pd.pivot_table( df, values='销售额', index='城市', # 行分组 columns='产品', # 列分组 aggfunc='sum' # 聚合函数 ) # 多值、多聚合 pivot2 = pd.pivot_table( df, values=['销售额', '数量'], index='城市', columns='产品', aggfunc={'销售额': 'sum', '数量': 'mean'} ) # 添加边际(总计) pivot3 = pd.pivot_table( df, values='销售额', index='城市', columns='产品', aggfunc='sum', margins=True, margins_name='总计' ) # 多级行索引 pivot4 = pd.pivot_table( df, values='销售额', index=['城市', '产品'], aggfunc='sum' ) # 重置透视表索引 pivot4.reset_index()📚 学习资料(Obsidian 可直接收藏)
官方文档
Pandas 官方中文文档
Pandas API Reference中文教程
菜鸟教程 - Pandas
Pandas 入门教程(十分钟)书籍推荐
《利用 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 逐行运行示例,观察输出结果。
