数据科学与分析库

📊 Pandas - 高效数据处理与分析工具

1. 核心功能与应用场景

核心功能:提供高性能、易用的数据结构(Series、DataFrame)和数据分析工具

应用场景:数据清洗、转换、聚合、时间序列分析、表格数据处理

优势:简洁的API、强大的索引功能、灵活的数据操作能力

2. 快速入门

安装与基础结构

bash

pip install pandas numpy  # 安装Pandas及依赖

python

import pandas as pd
import numpy as np

# 创建Series(一维数据)
s = pd.Series(
    data=[10, 20, 30, 40, 50],
    index=['a', 'b', 'c', 'd', 'e'],
    name='示例数据'
)

# 创建DataFrame(二维表格数据)
df = pd.DataFrame({
    '姓名': ['张三', '李四', '王五', '赵六', '钱七'],
    '年龄': [25, 32, 28, 45, 36],
    '部门': ['技术部', '市场部', '技术部', '财务部', '技术部'],
    '工资': [15000, 12000, 18000, 10000, 20000]
})

# 基础查看操作
print("数据预览:\n", df.head(3))          # 查看前3行
print("数据信息:\n", df.info())           # 数据类型和非空值信息
print("统计摘要:\n", df.describe())       # 数值列统计信息
print("部门分布:\n", df['部门'].value_counts())  # 分类值计数

3. 核心功能详解

3.1 数据选择与筛选

操作类型

方法

代码示例

按列选择

直接索引

df['姓名']df.姓名

按行选择

loc(标签)

df.loc[0:2, ['姓名', '工资']]

按行选择

iloc(位置)

df.iloc[0:2, [0, 3]]

条件筛选

布尔索引

df[df['工资'] > 15000]

组合条件

逻辑运算符

df[(df['工资'] > 15000) & (df['部门'] == '技术部')]

条件查询

query方法

df.query("工资 > 15000 and 部门 == '技术部'")

实用示例

python

# 基础选择
names = df['姓名']  # 单列选择
top2 = df.loc[:1, ['姓名', '部门']]  # 前2行,指定列

# 条件筛选
high_income = df[df['工资'] > 15000]
tech_department = df[df['部门'].isin(['技术部', '研发部'])]

# 复杂条件
complex_filter = df[
    (df['年龄'] > 30) & 
    (df['工资'] > 12000) & 
    (df['部门'] != '财务部')
]

# 范围筛选
age_range = df[df['年龄'].between(25, 35)]

# 查询方法(更直观的语法)
result = df.query("""
    年龄 > 30 and 
    工资 > 12000 and 
    部门 not in ['财务部', '行政部']
""")

3.2 数据清洗与转换

缺失值处理

python

# 检测缺失值
missing_values = df.isnull().sum()

# 删除缺失值
df_clean = df.dropna(subset=['工资', '部门'])  # 指定列

# 填充缺失值
df_filled = df.fillna({
    '年龄': df['年龄'].median(),  # 中位数填充
    '工资': df['工资'].mean()     # 均值填充
})

# 替换值
df_replaced = df.replace({
    '部门': {'技术部': '研发部', '市场部': '营销部'},
    '工资': {0: df['工资'].mean()}
})

数据类型转换

python

# 查看数据类型
print(df.dtypes)

# 转换数据类型
df['年龄'] = df['年龄'].astype('int32')  # 整数类型
df['入职日期'] = pd.to_datetime(df['入职日期'])  # 日期类型
df['工资'] = pd.to_numeric(df['工资'], errors='coerce')  # 转换为数值,错误值设为NaN

# 分类数据处理
df['部门'] = df['部门'].astype('category')  # 转换为分类类型
df['工资等级'] = pd.cut(
    df['工资'], 
    bins=[0, 10000, 20000, np.inf],
    labels=['低', '中', '高']
)

3.3 数据分组与聚合

基础分组聚合

python

# 按部门分组计算平均工资和年龄
dept_stats = df.groupby('部门').agg({
    '工资': ['mean', 'max', 'min', 'count'],
    '年龄': ['mean', 'median']
})

# 重命名列
dept_stats.columns = ['_'.join(col).strip() for col in dept_stats.columns.values]

# 分组后应用自定义函数
def salary_range(group):
    return group.max() - group.min()

dept_stats['工资_range'] = df.groupby('部门')['工资'].apply(salary_range)

高级分组操作

python

# 分组转换(保留原数据结构)
df['部门平均工资'] = df.groupby('部门')['工资'].transform('mean')
df['工资与部门平均差'] = df['工资'] - df['部门平均工资']

# 多级分组
dept_age_stats = df.groupby(['部门', '工资等级']).agg({
    '年龄': 'mean',
    '姓名': 'count'
}).reset_index()  # 重置索引,将分组键转为列

3.4 数据合并与连接

合并类型

描述

merge方法

concat方法

内连接

只保留匹配的行

pd.merge(a, b, on='key', how='inner')

-

左连接

保留左表所有行

pd.merge(a, b, on='key', how='left')

-

右连接

保留右表所有行

pd.merge(a, b, on='key', how='right')

-

全连接

保留所有行

pd.merge(a, b, on='key', how='outer')

-

行合并

垂直拼接

-

pd.concat([a, b], axis=0)

列合并

水平拼接

-

pd.concat([a, b], axis=1)

示例

python

# 创建示例数据
df1 = df[['姓名', '部门', '工资']]
df2 = pd.DataFrame({
    '姓名': ['张三', '李四', '王五', '赵六'],
    '绩效评分': [4.8, 4.2, 4.5, 3.9],
    '是否优秀': [True, False, True, False]
})

# 内连接(只保留匹配的记录)
merged_inner = pd.merge(df1, df2, on='姓名', how='inner')

# 左连接(保留左表所有记录)
merged_left = pd.merge(df1, df2, on='姓名', how='left')

# 处理缺失值
merged_left['绩效评分'] = merged_left['绩效评分'].fillna(merged_left['绩效评分'].mean())

# 行合并
df_concat = pd.concat([df1, df2], axis=1)  # 按列拼接

4. 实战案例:员工数据分析

需求:分析员工薪资结构,识别薪资异常值,生成部门薪资报告

python

# 1. 数据加载与初步检查
df = pd.read_excel('员工数据.xlsx')
print(f"数据形状: {df.shape}")
print(f"数据字段: {df.columns.tolist()}")
print(f"缺失值情况:\n{df.isnull().sum()}")

# 2. 数据清洗
df_clean = df.copy()

# 处理缺失值
df_clean['入职日期'] = df_clean['入职日期'].fillna(pd.Timestamp('2023-01-01'))
df_clean['工资'] = df_clean['工资'].fillna(df_clean.groupby('部门')['工资'].transform('median'))

# 数据类型转换
df_clean['入职日期'] = pd.to_datetime(df_clean['入职日期'])
df_clean['部门'] = df_clean['部门'].astype('category')

# 3. 特征工程
df_clean['司龄'] = (pd.Timestamp.now() - df_clean['入职日期']).dt.days // 365
df_clean['薪资等级'] = pd.cut(
    df_clean['工资'], 
    bins=[0, 8000, 15000, 25000, np.inf],
    labels=['初级', '中级', '高级', '资深']
)

# 4. 数据分析
## 部门薪资统计
dept_salary = df_clean.groupby('部门').agg({
    '工资': ['count', 'mean', 'median', 'min', 'max', 'std']
}).round(2)
dept_salary.columns = ['人数', '平均工资', '中位数工资', '最低工资', '最高工资', '工资标准差']

## 异常值检测(使用IQR方法)
def detect_outliers(group):
    q1 = group.quantile(0.25)
    q3 = group.quantile(0.75)
    iqr = q3 - q1
    lower_bound = q1 - 1.5 * iqr
    upper_bound = q3 + 1.5 * iqr
    return (group < lower_bound) | (group > upper_bound)

df_clean['薪资异常'] = df_clean.groupby('部门')['工资'].transform(detect_outliers)
outliers = df_clean[df_clean['薪资异常']]
print(f"检测到 {len(outliers)} 个薪资异常值")

# 5. 结果导出
with pd.ExcelWriter('员工薪资分析报告.xlsx') as writer:
    df_clean.to_excel(writer, sheet_name='清洗后数据', index=False)
    dept_salary.reset_index().to_excel(writer, sheet_name='部门薪资统计', index=False)
    outliers.to_excel(writer, sheet_name='薪资异常值', index=False)

print("分析完成,结果已导出到Excel文件")

5. 常见问题与解决方案

问题

解决方案

代码示例

数据类型错误

使用astypepd.to_xxx转换

df['工资'] = pd.to_numeric(df['工资'])

缺失值处理

根据情况选择删除或填充

df.fillna(df.mean(numeric_only=True))

大数据集处理

分块读取

pd.read_csv('大文件.csv', chunksize=10000)

内存占用高

优化数据类型

df['部门'] = df['部门'].astype('category')

重复数据

去重处理

df.drop_duplicates(subset=['姓名', '身份证'], keep='first')

数据透视

使用透视表

pd.pivot_table(df, values='工资', index='部门', columns='薪资等级', aggfunc='count')

6. 性能优化技巧

提升Pandas性能的10个实用技巧

  1. 使用适当的数据类型

    python

    # 将字符串列转换为分类类型(节省内存)
    df['部门'] = df['部门'].astype('category')
    
    # 使用更小的数值类型
    df['年龄'] = pd.to_numeric(df['年龄'], downcast='integer')
    df['工资'] = pd.to_numeric(df['工资'], downcast='float')
    
    
  2. 使用向量化操作替代循环

    python

    # 低效:循环操作
    result = []
    for idx, row in df.iterrows():
        result.append(row['工资'] * 1.2)
    df['工资_涨薪'] = result
    
    # 高效:向量化操作
    df['工资_涨薪'] = df['工资'] * 1.2
    
    
  3. 使用queryeval进行高效计算

    python

    # 普通方法
    df['年薪'] = df['工资'] * 12 + df['年终奖']
    
    # 更高效的方法(尤其对大数据集)
    df['年薪'] = df.eval("工资 * 12 + 年终奖")
    
    
  4. 使用inplace参数减少内存占用

    python

    # 不推荐(创建副本)
    df = df.drop(columns=['无用列'])
    
    # 推荐(原地修改)
    df.drop(columns=['无用列'], inplace=True)
    
    

📈 NumPy - 数值计算基础库

1. 核心功能与应用场景

核心功能:提供高性能多维数组对象和数学函数

应用场景:数值计算、矩阵运算、信号处理、科学计算

优势:C语言实现的核心算法、向量化操作、广播机制

2. 快速入门

python

import numpy as np

# 创建数组
a = np.array([1, 2, 3, 4, 5])  # 一维数组
b = np.array([[1, 2, 3], [4, 5, 6]])  # 二维数组

# 数组属性
print(f"数组维度: {b.ndim}")    # 维度
print(f"数组形状: {b.shape}")   # 形状
print(f"数组大小: {b.size}")    # 元素数量
print(f"数据类型: {b.dtype}")   # 数据类型

# 基本操作
print(f"求和: {b.sum()}")        # 总和
print(f"均值: {b.mean()}")      # 均值
print(f"最大值: {b.max()}")     # 最大值
print(f"按行求和: {b.sum(axis=1)}")  # 沿轴操作

# 数组运算
c = b * 2  # 元素乘法
d = b + c  # 元素加法
e = np.dot(b, b.T)  # 矩阵乘法

🚀 其他核心库速查

🔄 Requests - HTTP请求库

核心功能:发送HTTP请求,处理响应,支持会话管理和认证

python

import requests

# 基本GET请求
response = requests.get(
    "https://api.github.com/users/octocat",
    headers={"Accept": "application/vnd.github.v3+json"},
    timeout=10
)

# 检查响应状态
if response.status_code == 200:
    data = response.json()
    print(f"用户名: {data['name']}")
    print(f"仓库数量: {data['public_repos']}")

# POST请求发送数据
payload = {"title": "新文章", "content": "文章内容"}
response = requests.post(
    "https://api.example.com/posts",
    json=payload,
    auth=("username", "password")
)

# 文件上传
files = {"file": ("报告.pdf", open("报告.pdf", "rb"), "application/pdf")}
response = requests.post("https://httpbin.org/post", files=files)

# 会话管理(保持登录状态)
with requests.Session() as session:
    # 登录
    session.post("https://example.com/login", data={"user": "名", "pass": "密码"})
    
    # 已登录状态访问
    response = session.get("https://example.com/个人中心")

📂 Pathlib - 文件系统路径处理

核心功能:面向对象的文件系统路径操作,替代传统的os.path模块

python

from pathlib import Path

# 创建路径对象
data_dir = Path("data")
file_path = data_dir / "results.csv"  # 路径拼接

# 路径属性
print(f"文件名: {file_path.name}")      # "results.csv"
print(f"扩展名: {file_path.suffix}")   # ".csv"
print(f"父目录: {file_path.parent}")   # "data"
print(f"绝对路径: {file_path.absolute()}")

# 文件操作
if not data_dir.exists():
    data_dir.mkdir(parents=True, exist_ok=True)  # 创建目录
    
# 写入文件
file_path.write_text("姓名,年龄\n张三,30\n李四,25")

# 读取文件
content = file_path.read_text(encoding="utf-8")

# 查找文件
csv_files = list(data_dir.glob("**/*.csv"))  # 递归查找所有CSV文件

# 文件重命名
new_path = file_path.with_name("new_results.csv")
file_path.rename(new_path)

🔧 常用工具函数库

1. 数据处理

库名

功能

核心函数

NumPy

数值计算

np.array(), np.mean(), np.dot()

Pandas

数据分析

pd.DataFrame(), df.groupby(), df.merge()

SciPy

科学计算

scipy.stats, scipy.optimize, scipy.signal

xlrd/openpyxl

Excel读写

pd.read_excel(), pd.ExcelWriter()

2. Web开发

库名

功能

核心函数

Requests

HTTP请求

requests.get(), requests.post(), Session()

Flask

Web框架

Flask(), @app.route(), render_template()

FastAPI

API开发

FastAPI(), @app.get(), pydantic.BaseModel

BeautifulSoup

HTML解析

BeautifulSoup(), find(), find_all()

3. 系统工具

库名

功能

核心函数

Pathlib

路径处理

Path(), mkdir(), glob()

Subprocess

子进程管理

subprocess.run(), Popen(), communicate()

Shutil

文件操作

shutil.copy(), shutil.move(), shutil.rmtree()

Logging

日志记录

logging.basicConfig(), logger.info()

4. 数据可视化

库名

功能

核心函数

Matplotlib

基础绘图

plt.plot(), plt.scatter(), plt.bar()

Seaborn

统计绘图

sns.barplot(), sns.boxplot(), sns.heatmap()

Plotly

交互式图表

plotly.express.line(), Figure.show()

Pandas

简易绘图

df.plot(), df.hist(), df.boxplot()

📚 扩展学习资源

  1. 官方文档

  2. 推荐书籍

    • 《Python for Data Analysis》by Wes McKinney (Pandas创始人)

    • 《Python Data Science Handbook》by Jake VanderPlas

    • 《Fluent Python》by Luciano Ramalho

  3. 在线教程

  4. 性能优化

🛠️ 实用工具与资源

1. 环境管理

  • 虚拟环境python -m venv .venv

  • 依赖管理pip freeze > requirements.txt

  • 环境复制pip install -r requirements.txt

2. 代码调试与优化

  • 调试工具pdb.set_trace() 或 IDE断点调试

  • 性能分析cProfile.run('函数名()')

  • 内存分析memory_profiler

3. 常用快捷命令

bash

# 安装库
pip install pandas numpy requests

# 升级库
pip install --upgrade pandas

# 导出环境
pip freeze > requirements.txt

# 安装项目依赖
pip install -r requirements.txt

# 检查库冲突
pip check

graph TD A[数据加载] --> B[数据清洗] B --> C[数据转换] C --> D[数据分析] D --> E[结果可视化] E --> F[报告导出] subgraph 核心库 B --> Pandas清洗[Pandas] C --> Pandas转换[Pandas/NumPy] D --> Pandas分析[Pandas] E --> Matplotlib[Matplotlib/Seaborn] F --> ExcelWriter[Pandas] end style A fill:#f9f,stroke:#333 style B fill:#bbf,stroke:#333 style C fill:#bfb,stroke:#333 style D fill:#fbb,stroke:#333 style E fill:#fbf,stroke:#333 style F fill:#bff,stroke:#333