当前位置:首页 > Python > 正文

Python Pandas数据分析库核心知识点完全指南 | 数据科学必备技能

Python Pandas数据分析库核心知识点完全指南

作者:数据分析专家 | 更新日期:2023年10月15日

核心要点

Pandas是Python数据分析的核心库,提供高效的数据结构和数据处理功能。本教程涵盖:

  • Series和DataFrame数据结构
  • 数据读取与写入
  • 数据选择与过滤
  • 数据清洗与预处理
  • 数据合并与重塑
  • 分组聚合操作
  • 时间序列处理
  • 数据可视化

1. 核心数据结构:Series与DataFrame

Series:带标签的一维数组

Series是Pandas中最基本的数据结构,类似于带标签的一维数组。

import pandas as pd

# 创建Series
data = [10, 20, 30, 40]
s = pd.Series(data, index=['a', 'b', 'c', 'd'])
print(s)

# 输出:
# a    10
# b    20
# c    30
# d    40
# dtype: int64

DataFrame:二维表格数据结构

DataFrame是Pandas的核心数据结构,类似于Excel表格或SQL表。

# 创建DataFrame
data = {
    'Name': ['Alice', 'Bob', 'Charlie', 'David'],
    'Age': [25, 30, 35, 40],
    'City': ['New York', 'Paris', 'London', 'Tokyo']
}
df = pd.DataFrame(data)
print(df)

数据结构特点对比

特性 Series DataFrame
维度 一维 二维
索引 行索引 行索引和列索引
创建方式 列表、字典 字典、二维数组
数据访问 索引/标签 列名、loc、iloc

2. 数据读取与写入

读取数据

# 读取CSV文件
df = pd.read_csv('data.csv')

# 读取Excel文件
df = pd.read_excel('data.xlsx', sheet_name='Sheet1')

# 读取SQL数据库
import sqlite3
conn = sqlite3.connect('database.db')
df = pd.read_sql_query('SELECT * FROM table_name', conn)

写入数据

# 写入CSV文件
df.to_csv('output.csv', index=False)

# 写入Excel文件
df.to_excel('output.xlsx', sheet_name='Data', index=False)

# 写入SQL数据库
from sqlalchemy import create_engine
engine = create_engine('sqlite:///output.db')
df.to_sql('table_name', engine, if_exists='replace')

常用参数说明

  • header: 指定作为列名的行(默认0)
  • index_col: 用作行索引的列编号或列名
  • usecols: 读取指定的列
  • dtype: 指定列的数据类型
  • na_values: 识别为NaN的值
  • encoding: 文件编码(如'utf-8')

3. 数据选择与过滤

选择列

# 选择单列
df['Name']

# 选择多列
df[['Name', 'Age']]

选择行

# 通过索引选择
df.loc[0]       # 选择第一行
df.loc[0:2]    # 选择前三行

# 通过位置选择
df.iloc[0]      # 选择第一行
df.iloc[0:3]    # 选择前三行

布尔索引

# 筛选年龄大于30的记录
df[df['Age'] > 30]

# 多条件筛选
df[(df['Age'] > 25) & (df['City'] == 'London')]

# 使用query方法
df.query('Age > 25 and City == "London"')

选择方法对比

方法 用途 示例
[] 选择列 df['col']
loc 基于标签选择 df.loc[0, 'col']
iloc 基于位置选择 df.iloc[0, 1]
at 快速访问标量 df.at[0, 'col']
iat 快速访问标量 df.iat[0, 1]

4. 数据清洗与预处理

处理缺失值

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

# 删除包含缺失值的行
df.dropna()

# 填充缺失值
df['Age'].fillna(df['Age'].mean(), inplace=True)
df.fillna({'Age': 30, 'Salary': 50000}, inplace=True)

处理重复值

# 检测重复行
df.duplicated()

# 删除重复行
df.drop_duplicates()

# 基于列删除重复值
df.drop_duplicates(subset=['Name', 'Email'])

数据类型转换

# 查看数据类型
df.dtypes

# 转换数据类型
df['Age'] = df['Age'].astype('int32')
df['Date'] = pd.to_datetime(df['Date'])

# 分类数据类型
df['Category'] = df['Category'].astype('category')

数据清洗最佳实践

  • 始终先检查数据质量(df.info(), df.describe())
  • 处理缺失值前分析缺失模式
  • 数值变量考虑使用均值/中位数填充
  • 分类变量考虑使用众数或新类别填充
  • 对于时间序列数据,使用前后值填充
  • 删除重复值前确认业务逻辑

5. 数据合并与连接

concat:沿轴拼接

# 垂直拼接(行方向)
pd.concat([df1, df2], axis=0)

# 水平拼接(列方向)
pd.concat([df1, df2], axis=1)

merge:数据库风格合并

# 内连接
pd.merge(df1, df2, on='key', how='inner')

# 左连接
pd.merge(df1, df2, on='key', how='left')

# 右连接
pd.merge(df1, df2, on='key', how='right')

# 外连接
pd.merge(df1, df2, on='key', how='outer')

join:索引合并

# 按索引连接
df1.join(df2, how='left')

# 按列连接
df1.set_index('key').join(df2.set_index('key'))

合并操作比较

方法 适用场景 特点
concat 简单堆叠数据 沿轴拼接,保留索引
merge 基于键合并 类似SQL JOIN操作
join 基于索引合并 DataFrame方法,方便索引合并

6. 分组聚合操作

基本分组操作

# 按单列分组
grouped = df.groupby('City')

# 按多列分组
grouped = df.groupby(['City', 'Department'])

# 遍历分组
for name, group in grouped:
    print(name)
    print(group)

聚合计算

# 单聚合函数
df.groupby('City')['Sales'].sum()

# 多聚合函数
df.groupby('City')['Sales'].agg(['sum', 'mean', 'max'])

# 不同列不同聚合
df.groupby('City').agg({
    'Sales': 'sum',
    'Profit': 'mean',
    'Employees': 'count'
})

转换与过滤

# 转换:计算每组的z-score
def z_score(group):
    return (group - group.mean()) / group.std()
    
df['z_score'] = df.groupby('City')['Sales'].transform(z_score)

# 过滤:保留销售总额大于10000的城市
df.groupby('City').filter(lambda x: x['Sales'].sum() > 10000)

常用聚合函数

  • sum() - 求和
  • mean() - 平均值
  • median() - 中位数
  • min() - 最小值
  • max() - 最大值
  • std() - 标准差
  • var() - 方差
  • count() - 计数
  • size() - 分组大小

7. 时间序列处理

时间戳与时间序列

# 创建时间戳
timestamp = pd.Timestamp('2023-01-01')

# 创建时间范围
date_range = pd.date_range('2023-01-01', periods=5, freq='D')

# 创建时间序列
ts = pd.Series([1, 2, 3, 4, 5], index=date_range)

重采样

# 按天采样
daily_data = df.resample('D').sum()

# 降采样:按月求平均
monthly_avg = df.resample('M').mean()

# 升采样:按小时填充
hourly_data = df.resample('H').ffill()

时间偏移

# 时间偏移
df['next_day'] = df['date'] + pd.DateOffset(days=1)

# 计算时间差
df['days_between'] = (df['end_date'] - df['start_date']).dt.days

# 移动数据
df['prev_sales'] = df['sales'].shift(1)

时间频率别名

别名 说明 别名 说明
B 工作日 D 日历日
W M 月末
Q 季度末 A 年末
H 小时 T 分钟

8. 数据可视化

基本绘图

# 折线图
df.plot(x='Date', y='Sales', title='Sales Trend')

# 柱状图
df.plot.bar(x='City', y='Population')

# 直方图
df['Age'].plot.hist(bins=20, alpha=0.5)

# 箱线图
df.boxplot(column='Salary', by='Department')

高级可视化

# 散点图
df.plot.scatter(x='Age', y='Income', c='blue')

# 六边形分箱图
df.plot.hexbin(x='Age', y='Income', gridsize=25)

# 面积图
df.plot.area(x='Date', y=['Sales', 'Profit'])

# 饼图
df.groupby('Category')['Sales'].sum().plot.pie(autopct='%1.1f%%')

绘图自定义

# 设置图形大小
ax = df.plot(figsize=(10, 6))

# 添加标题和标签
ax.set_title('Monthly Sales')
ax.set_xlabel('Date')
ax.set_ylabel('Sales (USD)')

# 添加网格线
ax.grid(True, linestyle='--', alpha=0.7)

# 设置图例
ax.legend(loc='best', frameon=True)

# 保存图像
ax.figure.savefig('sales_trend.png', dpi=300)

可视化最佳实践

  • 选择适合数据类型的图表(分类数据用条形图,时间序列用折线图)
  • 避免使用3D图表(容易造成误解)
  • 使用清晰的标签和标题
  • 限制图例项数量(最好不超过6项)
  • 使用适当的颜色方案(避免过于鲜艳)
  • 添加必要的注释(如关键点、异常值)

Pandas学习路线建议

基础阶段

数据结构

数据读写

数据选择

进阶阶段

数据清洗

数据合并

分组聚合

高级阶段

时间序列

高效处理

数据可视化

"掌握Pandas是成为Python数据分析师的关键一步。持续练习,结合实际项目应用这些技能!"

延伸学习资源

  • 官方文档:pandas.pydata.org
  • 《Python for Data Analysis》- Wes McKinney
  • Pandas Cookbook - Ted Petrou
  • DataCamp:Pandas Foundations
  • Coursera:Applied Data Science with Python
  • Kaggle:Pandas课程与练习

发表评论