Python数据分析Pandas(2026-03-27)


文档摘要

Python数据分析:Pandas实战指南 概述 Pandas是Python数据分析的核心库,提供了高效的数据结构和数据分析工具。基于NumPy构建,Pandas特别适合处理表格数据、时间序列和结构化数据,是数据科学、机器学习和业务分析的必备工具。 核心数据结构 Series(一维数据) DataFrame(二维数据) 数据选择与过滤 列选择 行选择 高级索引 数据清洗 处理缺失值 处理重复值 数据类型转换 异常值处理 数据变换 添加/修改列 排序 分组聚合 数据透视 时间序列分析 数据合并 数据导出 性能优化 实用技巧 链式操作 自定义函数 数据验证 总结 Pandas作为Python数据分析的核心工具,提供了丰富的数据操作和分析功能。

Python数据分析:Pandas实战指南

概述

Pandas是Python数据分析的核心库,提供了高效的数据结构和数据分析工具。基于NumPy构建,Pandas特别适合处理表格数据、时间序列和结构化数据,是数据科学、机器学习和业务分析的必备工具。

核心数据结构

Series(一维数据)

import pandas as pd import numpy as np # 创建Series s = pd.Series([1, 3, 5, np.nan, 6, 8]) print(s) # 指定索引 s = pd.Series([1, 3, 5, 7], index=['a', 'b', 'c', 'd']) # 字典创建 s = pd.Series({'a': 1, 'b': 2, 'c': 3}) # 访问元素 print(s['a']) # 通过标签 print(s[0]) # 通过位置 print(s[['a', 'c']]) # 多个标签

DataFrame(二维数据)

# 创建DataFrame data = { 'name': ['张三', '李四', '王五'], 'age': [25, 30, 35], 'city': ['北京', '上海', '深圳'] } df = pd.DataFrame(data) # 从文件读取 df = pd.read_csv('data.csv') df = pd.read_excel('data.xlsx') df = pd.read_json('data.json') # 查看数据 df.head() # 前5行 df.tail(3) # 后3行 df.info() # 数据信息 df.describe() # 统计摘要 df.shape # 形状(行,列) df.columns # 列名 df.index # 索引 df.dtypes # 数据类型

数据选择与过滤

列选择

# 单列 df['name'] # 返回Series df.name # 返回Series # 多列 df[['name', 'age']] # 返回DataFrame # 按位置 df.iloc[:, 0] # 第1列 df.iloc[:, [0, 2]] # 第1和3列

行选择

# 按标签 df.loc[0] # 第1行 df.loc[0:2] # 第1-3行 df.loc[0:2, 'name'] # 第1-3行的name列 # 按位置 df.iloc[0] # 第1行 df.iloc[0:2] # 第1-3行 df.iloc[0:2, 0] # 第1-3行的第1列 # 条件过滤 df[df['age'] > 30] # 年龄大于30 df[(df['age'] > 25) & (df['age'] < 35)] # 年龄在25-35之间 df[df['city'].isin(['北京', '上海'])] # 城市是北京或上海 df[df['name'].str.contains('张')] # 姓名包含"张"

高级索引

# 设置索引 df.set_index('name', inplace=True) # 重置索引 df.reset_index(inplace=True) # 多级索引 df.set_index(['city', 'name'], inplace=True) # 交叉表 df.loc['北京', '张三'] # 北京的张三

数据清洗

处理缺失值

# 检测缺失值 df.isnull() # 返回布尔值 df.isnull().sum() # 每列的缺失值数量 df.isnull().sum().sum() # 总缺失值数量 # 删除缺失值 df.dropna() # 删除包含缺失值的行 df.dropna(axis=1) # 删除包含缺失值的列 df.dropna(thresh=2) # 至少有2个非缺失值才保留 df.dropna(subset=['age']) # 删除age列缺失的行 # 填充缺失值 df.fillna(0) # 填充为0 df.fillna(method='ffill') # 前向填充 df.fillna(method='bfill') # 后向填充 df.fillna(df.mean()) # 用均值填充 df['age'].fillna(df['age'].median(), inplace=True) # 用中位数填充 # 插值 df['value'].interpolate() # 线性插值

处理重复值

# 检测重复值 df.duplicated() # 返回布尔值 df.duplicated().sum() # 重复值数量 # 删除重复值 df.drop_duplicates() # 删除所有重复行 df.drop_duplicates(subset=['name']) # 删除name重复的行 df.drop_duplicates(keep='first') # 保留第一个 df.drop_duplicates(keep='last') # 保留最后一个 df.drop_duplicates(keep=False) # 删除所有重复行

数据类型转换

# 查看数据类型 df.dtypes # 转换数据类型 df['age'] = df['age'].astype(int) df['price'] = df['price'].astype(float) df['date'] = pd.to_datetime(df['date']) # 分类类型 df['city'] = df['city'].astype('category') # 字符串操作 df['name'] = df['name'].str.upper() df['name'] = df['name'].str.strip() df['email'] = df['email'].str.lower()

异常值处理

# 统计方法检测异常值 mean = df['age'].mean() std = df['age'].std() threshold = 3 outliers = df[df['age'] > mean + threshold * std] # 四分位数法 Q1 = df['age'].quantile(0.25) Q3 = df['age'].quantile(0.75) IQR = Q3 - Q1 outliers = df[(df['age'] < Q1 - 1.5*IQR) | (df['age'] > Q3 + 1.5*IQR)] # 处理异常值 df = df[(df['age'] >= Q1 - 1.5*IQR) & (df['age'] <= Q3 + 1.5*IQR)] df['age'] = df['age'].clip(lower=Q1 - 1.5*IQR, upper=Q3 + 1.5*IQR)

数据变换

添加/修改列

# 添加新列 df['total'] = df['price'] * df['quantity'] df['full_name'] = df['first_name'] + ' ' + df['last_name'] # 修改列 df['age'] = df['age'] + 1 # 条件赋值 df.loc[df['age'] < 18, 'status'] = '未成年' df.loc[df['age'] >= 18, 'status'] = '成年' # apply函数 df['price_level'] = df['price'].apply(lambda x: '高' if x > 1000 else '低') df['name_length'] = df['name'].apply(len) # map映射 df['city_code'] = df['city'].map({'北京': 'BJ', '上海': 'SH', '深圳': 'SZ'})

排序

# 按列排序 df.sort_values('age') # 升序 df.sort_values('age', ascending=False) # 降序 df.sort_values(['city', 'age']) # 多列排序 # 按索引排序 df.sort_index() df.sort_index(ascending=False)

分组聚合

# 单列分组 df.groupby('city')['age'].mean() df.groupby('city')['salary'].sum() # 多列分组 df.groupby(['city', 'department'])['salary'].mean() # 多种聚合函数 df.groupby('city').agg({ 'age': 'mean', 'salary': ['sum', 'mean', 'count'] }) # 自定义聚合函数 df.groupby('city').agg({ 'age': lambda x: x.max() - x.min() }) # 分组后过滤 df.groupby('city').filter(lambda x: x['salary'].mean() > 10000) # 分组后转换 df['salary_rank'] = df.groupby('city')['salary'].rank()

数据透视

# 透视表 pd.pivot_table(df, values='salary', index='city', columns='department', aggfunc='mean') # 交叉表 pd.crosstab(df['city'], df['department']) # 熔化数据 pd.melt(df, id_vars=['name', 'city'], value_vars=['math', 'english', 'science'], var_name='subject', value_name='score')

时间序列分析

# 创建时间序列 dates = pd.date_range('2024-01-01', periods=100, freq='D') ts = pd.Series(np.random.randn(100), index=dates) # 重采样 ts.resample('W').mean() # 按周重采样 ts.resample('M').sum() # 按月重采样 ts.resample('Q').std() # 按季度重采样 # 时间窗口 ts.rolling(window=7).mean() # 7天移动平均 ts.rolling(window=30).std() # 30天移动标准差 ts.ewm(span=20).mean() # 指数加权移动平均 # 时间差 df['date2'] - df['date1'] df['date_diff'] = (df['date2'] - df['date1']).dt.days

数据合并

# 拼接 pd.concat([df1, df2]) # 垂直拼接 pd.concat([df1, df2], axis=1) # 水平拼接 # 合并 pd.merge(df1, df2, on='key') # 内连接 pd.merge(df1, df2, on='key', how='left') # 左连接 pd.merge(df1, df2, on='key', how='right') # 右连接 pd.merge(df1, df2, on='key', how='outer') # 外连接 pd.merge(df1, df2, left_on='key1', right_on='key2') # 不同键名 # 连接 df1.join(df2, on='key', how='left')

数据导出

# 导出CSV df.to_csv('output.csv', index=False, encoding='utf-8') # 导出Excel df.to_excel('output.xlsx', sheet_name='Sheet1', index=False) # 导出JSON df.to_json('output.json', orient='records', force_ascii=False) # 导出SQL from sqlalchemy import create_engine engine = create_engine('sqlite:///database.db') df.to_sql('table_name', engine, if_exists='replace', index=False)

性能优化

# 使用向量化操作 df['total'] = df['price'] * df['quantity'] # 快 # 避免: # for i in range(len(df)): # df.loc[i, 'total'] = df.loc[i, 'price'] * df.loc[i, 'quantity'] # 慢 # 使用category类型 df['city'] = df['city'].astype('category') # 使用eval() df.eval('total = price * quantity', inplace=True) # 减少内存占用 df = df.convert_dtypes() # 自动选择最佳数据类型 # 使用chunksize处理大文件 chunk_iter = pd.read_csv('large_file.csv', chunksize=10000) for chunk in chunk_iter: process(chunk)

实用技巧

链式操作

(df[df['age'] > 30] .groupby('city') .agg({'salary': 'mean'}) .sort_values('salary', ascending=False) .head(10))

自定义函数

def clean_phone(phone): phone = str(phone) phone = phone.replace('-', '') phone = phone.replace(' ', '') return phone df['phone'] = df['phone'].apply(clean_phone)

数据验证

# 验证数据范围 assert df['age'].min() >= 0 assert df['age'].max() < 150 # 验证数据完整性 assert df['name'].notnull().all() assert df['email'].str.contains('@').all()

总结

Pandas作为Python数据分析的核心工具,提供了丰富的数据操作和分析功能。掌握Pandas的基础操作和高级特性,可以高效地完成数据清洗、转换、分析和可视化任务,为数据科学和机器学习项目奠定坚实基础。结合NumPy、Matplotlib、Scikit-learn等工具,构建完整的数据分析工作流。


发布者: 作者: 转发
评论区 (0)
U