全面精通Pandas:数据处理与分析实战指南
本文是一份Pandas数据处理与分析实战指南,从基础入门到高级应用全面覆盖。主要内容包括:Pandas核心数据结构Series和DataFrame的使用;多种数据格式的读写操作;数据清洗与预处理技巧(缺失值、异常值处理等);数据选择与过滤方法;数据转换与计算(新增列、排序、分组聚合);以及时间序列分析(按小时/天/月/季度分析销售数据)。通过实际案例演示,帮助读者掌握Pandas的核心功能,最终能
从0到1掌握Pandas:数据处理与分析实战指南
Pandas是Python生态中最强大的数据处理库之一,广泛应用于金融分析、销售报表、用户行为分析等领域。本文将带你从零开始系统学习Pandas,通过实际案例掌握其核心功能,最终能够独立完成复杂的数据分析任务。
一、Pandas基础入门
1.1 安装与导入
首先确保安装了Pandas库,使用pip命令安装:
pip install pandas numpy matplotlib
在代码中导入必要的库:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 设置中文显示
plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC"]
1.2 核心数据结构
Pandas有两种核心数据结构:Series(一维数据)和DataFrame(二维数据)。
Series(一维数组)
# 创建Series
s = pd.Series([10, 20, 30, 40], name="销售额")
print("Series内容:")
print(s)
print("\nSeries索引:", s.index)
print("Series值:", s.values)
print("Series数据类型:", s.dtype)
DataFrame(二维表格)
# 创建DataFrame
data = {
'日期': ['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04'],
'销售额': [1500, 2200, 1800, 2500],
'客流量': [30, 45, 35, 50]
}
df = pd.DataFrame(data)
print("\nDataFrame内容:")
print(df)
print("\nDataFrame列名:", df.columns)
print("DataFrame索引:", df.index)
print("DataFrame形状:", df.shape)
二、数据读取与写入
Pandas支持多种数据格式的读写操作,包括CSV、Excel、JSON等。
# 读取CSV文件
# df = pd.read_csv('sales_data.csv')
# 读取Excel文件
# df = pd.read_excel('sales_data.xlsx', sheet_name='2023年销售数据')
# 写入CSV
# df.to_csv('output_data.csv', index=False)
# 写入Excel
# df.to_excel('output_data.xlsx', sheet_name='处理后数据', index=False)
# 为演示创建模拟销售数据
dates = pd.date_range(start='2023-01-01', end='2023-12-31', freq='H')
sales_data = pd.DataFrame({
'日期时间': dates,
'销售额': np.random.randint(500, 5000, size=len(dates)),
'客流量': np.random.randint(10, 100, size=len(dates)),
'门店': np.random.choice(['门店A', '门店B', '门店C'], size=len(dates))
})
print("\n模拟销售数据前5行:")
print(sales_data.head())
三、数据清洗与预处理
数据清洗是数据分析的基础,包括处理缺失值、异常值和数据类型转换等。
3.1 数据类型转换
# 查看数据类型
print("\n数据类型:")
print(sales_data.dtypes)
# 转换日期时间类型(如果不是)
sales_data['日期时间'] = pd.to_datetime(sales_data['日期时间'])
print("\n转换后的数据类型:")
print(sales_data.dtypes)
3.2 缺失值处理
# 为演示添加一些缺失值
sales_data_with_na = sales_data.copy()
sales_data_with_na.loc[np.random.choice(sales_data.index, 100), '销售额'] = np.nan
# 查看缺失值数量
print("\n缺失值数量:")
print(sales_data_with_na.isnull().sum())
# 处理缺失值 - 填充平均值
sales_data_clean = sales_data_with_na.fillna({
'销售额': sales_data_with_na['销售额'].mean()
})
# 或者删除缺失值
# sales_data_clean = sales_data_with_na.dropna()
print("\n处理后的缺失值数量:")
print(sales_data_clean.isnull().sum())
3.3 重复值处理
# 检查重复值
print("\n重复值数量:", sales_data.duplicated().sum())
# 删除重复值
sales_data = sales_data.drop_duplicates()
四、数据选择与过滤
掌握数据的选择和过滤是进行数据分析的基础技能。
# 选择列
sales = sales_data['销售额']
print("\n销售额列前5行:")
print(sales.head())
# 选择多列
subset = sales_data[['日期时间', '销售额', '门店']]
print("\n多列选择前5行:")
print(subset.head())
# 行选择 - 位置索引
print("\n前3行数据:")
print(sales_data.iloc[:3])
# 行选择 - 条件过滤
high_sales = sales_data[sales_data['销售额'] > 4000]
print(f"\n销售额超过4000的记录数:{len(high_sales)}")
print(high_sales.head())
# 组合条件
condition = (sales_data['销售额'] > 3000) & (sales_data['客流量'] > 60)
filtered = sales_data[condition]
print(f"\n销售额>3000且客流量>60的记录数:{len(filtered)}")
五、数据转换与计算
5.1 新增计算列
# 计算客单价(销售额/客流量)
sales_data['客单价'] = sales_data['销售额'] / sales_data['客流量']
sales_data['客单价'] = sales_data['客单价'].round(2) # 保留两位小数
print("\n新增客单价列后的数据:")
print(sales_data.head())
5.2 数据排序
# 按销售额降序排序
sorted_by_sales = sales_data.sort_values(by='销售额', ascending=False)
print("\n按销售额降序排序前5行:")
print(sorted_by_sales.head())
# 多列排序
sorted_by_store_sales = sales_data.sort_values(by=['门店', '销售额'], ascending=[True, False])
print("\n按门店和销售额排序前5行:")
print(sorted_by_store_sales.head())
5.3 数据分组与聚合
# 按门店分组,计算销售总额和平均客流量
store_summary = sales_data.groupby('门店').agg({
'销售额': ['sum', 'mean', 'count'],
'客流量': ['mean'],
'客单价': ['mean']
})
# 简化列名
store_summary.columns = ['_'.join(col).strip() for col in store_summary.columns.values]
print("\n各门店销售汇总:")
print(store_summary)
六、时间序列分析
时间序列分析是Pandas的强项,尤其适合销售数据和股票数据的分析。
6.1 销售数据时间维度分析
# 设置日期时间为索引
sales_data_timeindex = sales_data.set_index('日期时间')
# 按小时分析(每小时平均销售额)
hourly_sales = sales_data_timeindex.resample('H')['销售额'].mean()
print("\n每小时平均销售额前5行:")
print(hourly_sales.head())
# 按天分析(每天总销售额)
daily_sales = sales_data_timeindex.resample('D')['销售额'].sum()
print("\n每天总销售额前5行:")
print(daily_sales.head())
# 按月分析(每月总销售额)
monthly_sales = sales_data_timeindex.resample('M')['销售额'].sum()
monthly_sales.index = monthly_sales.index.strftime('%Y-%m') # 格式化日期显示
print("\n每月总销售额:")
print(monthly_sales)
# 按季度分析(每季度总销售额)
quarterly_sales = sales_data_timeindex.resample('Q')['销售额'].sum()
quarterly_sales.index = ['Q' + str(i+1) for i in range(len(quarterly_sales))]
print("\n每季度总销售额:")
print(quarterly_sales)
6.2 可视化时间趋势
# 绘制月度销售额趋势
plt.figure(figsize=(12, 6))
monthly_sales.plot(kind='bar', color='skyblue')
plt.title('2023年各月销售额趋势')
plt.xlabel('月份')
plt.ylabel('销售额(元)')
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()
# 绘制不同门店的月度销售额
sales_data['月份'] = sales_data['日期时间'].dt.to_period('M')
store_monthly = sales_data.groupby(['门店', '月份'])['销售额'].sum().unstack('门店')
plt.figure(figsize=(14, 7))
store_monthly.plot(kind='line', marker='o')
plt.title('各门店月度销售额趋势')
plt.xlabel('月份')
plt.ylabel('销售额(元)')
plt.grid(linestyle='--', alpha=0.7)
plt.legend(title='门店')
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()
七、股票数据分析案例
下面我们通过一个股票数据分析案例,展示Pandas在金融领域的应用。
# 创建模拟股票数据
dates = pd.date_range(start='2023-01-01', end='2023-12-31', freq='B') # 工作日
stock_data = pd.DataFrame({
'日期': dates,
'开盘价': np.random.uniform(100, 150, size=len(dates)),
'收盘价': np.random.uniform(100, 150, size=len(dates)),
'最高价': np.random.uniform(100, 160, size=len(dates)),
'最低价': np.random.uniform(90, 140, size=len(dates)),
'成交量': np.random.randint(1000000, 5000000, size=len(dates))
})
# 确保收盘价合理(在最高价和最低价之间)
stock_data['收盘价'] = stock_data.apply(
lambda row: np.clip(row['收盘价'], row['最低价'], row['最高价']), axis=1
)
# 设置日期为索引
stock_data = stock_data.set_index('日期')
print("\n股票数据前5行:")
print(stock_data.head())
# 计算每日涨跌幅
stock_data['涨跌幅'] = stock_data['收盘价'].pct_change() * 100 # 百分比
# 计算移动平均线(MA5, MA20, MA60)
stock_data['MA5'] = stock_data['收盘价'].rolling(window=5).mean()
stock_data['MA20'] = stock_data['收盘价'].rolling(window=20).mean()
stock_data['MA60'] = stock_data['收盘价'].rolling(window=60).mean()
print("\n计算技术指标后的股票数据:")
print(stock_data[['收盘价', '涨跌幅', 'MA5', 'MA20', 'MA60']].tail())
# 绘制股票价格和移动平均线
plt.figure(figsize=(14, 8))
plt.plot(stock_data.index, stock_data['收盘价'], label='收盘价', alpha=0.7)
plt.plot(stock_data.index, stock_data['MA5'], label='5日平均线', color='orange')
plt.plot(stock_data.index, stock_data['MA20'], label='20日平均线', color='green')
plt.plot(stock_data.index, stock_data['MA60'], label='60日平均线', color='red')
plt.title('股票价格及移动平均线')
plt.xlabel('日期')
plt.ylabel('价格(元)')
plt.legend()
plt.grid(linestyle='--', alpha=0.5)
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()
# 月度股票表现分析
monthly_performance = stock_data.resample('M').agg({
'开盘价': 'first',
'收盘价': 'last',
'最高价': 'max',
'最低价': 'min',
'成交量': 'sum'
})
# 计算月度涨跌幅
monthly_performance['月度涨跌幅(%)'] = (
(monthly_performance['收盘价'] - monthly_performance['开盘价']) /
monthly_performance['开盘价'] * 100
).round(2)
print("\n月度股票表现:")
print(monthly_performance[['开盘价', '收盘价', '最高价', '最低价', '月度涨跌幅(%)']])
八、数据合并与连接
在实际分析中,经常需要合并多个数据源:
# 创建两个DataFrame
df1 = pd.DataFrame({
'门店ID': ['A001', 'A002', 'A003'],
'门店名称': ['门店A', '门店B', '门店C'],
'区域': ['华东', '华北', '华南']
})
df2 = pd.DataFrame({
'门店ID': ['A001', 'A002', 'A003', 'A004'],
'店长': ['张三', '李四', '王五', '赵六'],
'开业时间': ['2020-01-15', '2021-03-20', '2019-11-10', '2022-05-01']
})
# 内连接(取交集)
inner_join = pd.merge(df1, df2, on='门店ID', how='inner')
print("\n内连接结果:")
print(inner_join)
# 左连接
left_join = pd.merge(df1, df2, on='门店ID', how='left')
print("\n左连接结果:")
print(left_join)
# 右连接
right_join = pd.merge(df1, df2, on='门店ID', how='right')
print("\n右连接结果:")
print(right_join)
九、高级功能:透视表
透视表是数据分析中非常强大的工具,可以灵活汇总数据:
# 创建销售透视表
pivot_table = sales_data.pivot_table(
values='销售额',
index=sales_data['日期时间'].dt.month, # 按月份
columns='门店', # 按门店
aggfunc='sum' # 求和
)
print("\n月度销售额透视表:")
print(pivot_table)
# 可视化透视表数据
plt.figure(figsize=(12, 6))
pivot_table.plot(kind='bar')
plt.title('各门店月度销售额对比')
plt.xlabel('月份')
plt.ylabel('销售额(元)')
plt.legend(title='门店')
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.xticks(rotation=0)
plt.tight_layout()
plt.show()
十、总结与进阶学习
通过本文,我们系统学习了Pandas的核心功能,包括:
- 数据结构(Series和DataFrame)
- 数据读写与清洗
- 数据选择、过滤与转换
- 分组聚合与时间序列分析
- 实际案例(销售分析与股票分析)
- 数据合并与透视表
进阶学习方向:
- 学习Pandas的性能优化技巧(处理大规模数据)
- 结合Scikit-learn进行机器学习建模
- 学习Pandas与其他库(如Dask、Vaex)的协同使用
- 探索Pandas的高级功能(如自定义函数、管道操作等)
Pandas的强大之处在于它能够快速处理各种复杂的数据转换和分析任务。熟练掌握Pandas将极大提升你的数据分析效率,无论是在学术研究、商业分析还是数据科学领域都能发挥重要作用。
记住,最好的学习方式是实践。找一个你感兴趣的数据集(如股票数据、销售数据或公开数据集),尝试应用本文所学的各种方法进行分析,你会在实践中不断加深理解。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)