从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的核心功能,包括:

  1. 数据结构(Series和DataFrame)
  2. 数据读写与清洗
  3. 数据选择、过滤与转换
  4. 分组聚合与时间序列分析
  5. 实际案例(销售分析与股票分析)
  6. 数据合并与透视表

进阶学习方向:

  • 学习Pandas的性能优化技巧(处理大规模数据)
  • 结合Scikit-learn进行机器学习建模
  • 学习Pandas与其他库(如Dask、Vaex)的协同使用
  • 探索Pandas的高级功能(如自定义函数、管道操作等)

Pandas的强大之处在于它能够快速处理各种复杂的数据转换和分析任务。熟练掌握Pandas将极大提升你的数据分析效率,无论是在学术研究、商业分析还是数据科学领域都能发挥重要作用。

记住,最好的学习方式是实践。找一个你感兴趣的数据集(如股票数据、销售数据或公开数据集),尝试应用本文所学的各种方法进行分析,你会在实践中不断加深理解。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐