上一篇
Python Pandas数据分析库核心知识点完全指南 | 数据科学必备技能
- Python
- 2025-07-27
- 1864
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课程与练习
本文由GuanQia于2025-07-27发表在吾爱品聚,如有疑问,请联系我们。
本文链接:https://www.521pj.cn/20256663.html
发表评论