Pandas全面操作指南与电商销售数据分析

Pandas全面操作指南与电商销售数据分析

Pandas 是 Python 中用于数据分析和操作的强大库,特别适合处理表格数据。本指南将详细介绍 Pandas 的核心功能,并通过一个复杂的电商销售数据分析案例,帮助你掌握这些操作,适用于期末考试复习或实际业务场景。


业务需求上下文

假设你是一家电商公司的数据分析师,负责分析 2023 年第一季度的销售数据。数据来源于三张表:

  1. 订单表:包含订单 ID、用户 ID、产品 ID、数量和订单日期。
  2. 用户信息表:包含用户 ID、姓名、区域和注册日期。
  3. 产品信息表:包含产品 ID、产品名称、类别和价格。

目标

  • 合并数据,生成完整数据集。
  • 分析销售趋势、区域表现、产品类别表现和用户行为。
  • 提供按区域和类别的销售透视表,以及畅销产品排名。

我们将通过 Pandas 实现这一需求,并在代码中结合本指南的知识点进行注释。


1. Pandas 基础与数据结构

1.1 安装与导入

python 复制代码
pip install pandas  # 如果未安装
import pandas as pd
import numpy as np  # 常与 Pandas 一起使用

1.2 核心数据结构

  • Series: 一维数据结构,类似带索引的数组。
  • DataFrame: 二维表格数据,类似 Excel 或 SQL 表。
创建 Series
python 复制代码
s = pd.Series([1, 3, 5, np.nan, 6, 8])
print(s)
# 输出:
# 0    1.0
# 1    3.0
# 2    5.0
# 3    NaN
# 4    6.0
# 5    8.0
# dtype: float64
创建 DataFrame
python 复制代码
data = {'Name': ['Alice', 'Bob', 'Cathy'],
        'Age': [25, 30, 35],
        'Score': [85, 90, 88]}
df = pd.DataFrame(data)
print(df)
# 输出:
#     Name  Age  Score
# 0  Alice   25     85
# 1    Bob   30     90
# 2  Cathy   35     88
业务应用:创建电商数据
python 复制代码
# 订单表
orders_data = {
    'Order_ID': [1001, 1002, 1003, 1004, 1005],
    'User_ID': [1, 2, 1, 3, 2],
    'Product_ID': [101, 102, 103, 101, 104],
    'Quantity': [2, 1, 3, 1, 4],
    'Order_Date': ['2023-01-05', '2023-01-06', '2023-02-01', '2023-02-15', '2023-03-01']
}
orders = pd.DataFrame(orders_data)

# 用户信息表
users_data = {
    'User_ID': [1, 2, 3, 4],
    'Name': ['Alice', 'Bob', 'Cathy', 'David'],
    'Region': ['North', 'South', 'East', 'West'],
    'Join_Date': ['2022-01-01', '2022-06-15', '2021-12-10', '2023-01-20']
}
users = pd.DataFrame(users_data)

# 产品信息表
products_data = {
    'Product_ID': [101, 102, 103, 104],
    'Product_Name': ['Laptop', 'Mouse', 'Keyboard', 'Monitor'],
    'Category': ['Electronics', 'Accessories', 'Accessories', 'Electronics'],
    'Price': [1000, 20, 50, 300]
}
products = pd.DataFrame(products_data)

2. 数据查看与基本操作

2.1 查看数据

  • df.head(n): 查看前 n 行(默认 5)。
  • df.tail(n): 查看后 n 行。
  • df.info(): 显示数据类型和非空值统计。
  • df.describe(): 统计描述(均值、标准差等)。
python 复制代码
print(df.head(2))
# 输出:
#     Name  Age  Score
# 0  Alice   25     85
# 1    Bob   30     90

print(df.describe())
# 输出:
#             Age      Score
# count  3.000000  3.000000
# mean   30.000000 87.666667
# std     5.000000  2.516611
# min    25.000000 85.000000
# 25%    27.500000 86.500000
# 50%    30.000000 88.000000
# 75%    32.500000 89.000000
# max    35.000000 90.000000
业务应用:查看订单数据
python 复制代码
print(orders.head())
# 输出:
#    Order_ID  User_ID  Product_ID  Quantity Order_Date
# 0      1001        1         101         2 2023-01-05
# 1      1002        2         102         1 2023-01-06
# 2      1003        1         103         3 2023-02-01
# 3      1004        3         101         1 2023-02-15
# 4      1005        2         104         4 2023-03-01

2.2 索引与切片

  • 列选择 : df['列名']df.列名
  • 行选择 : df.iloc[行索引](基于位置)或 df.loc[标签](基于标签)。
  • 条件筛选: 使用布尔索引。
python 复制代码
# 选择单列
print(df['Name'])
# 输出:
# 0    Alice
# 1      Bob
# 2    Cathy
# Name: Name, dtype: object

# 选择多列
print(df[['Name', 'Score']])
# 输出:
#     Name  Score
# 0  Alice     85
# 1    Bob     90
# 2  Cathy     88

# 按条件筛选
print(df[df['Age'] > 30])
# 输出:
#     Name  Age  Score
# 2  Cathy   35     88
业务应用:筛选高数量订单
python 复制代码
high_quantity_orders = orders[orders['Quantity'] > 2]
print(high_quantity_orders)
# 输出:
#    Order_ID  User_ID  Product_ID  Quantity Order_Date
# 2      1003        1         103         3 2023-02-01
# 4      1005        2         104         4 2023-03-01

3. 数据清洗

3.1 处理缺失值

  • df.isnull(): 检查缺失值。
  • df.dropna(): 删除含缺失值的行/列。
  • df.fillna(value): 填充缺失值。
python 复制代码
df_with_nan = pd.DataFrame({'A': [1, np.nan, 3], 'B': [4, 5, np.nan]})
print(df_with_nan)
# 输出:
#      A    B
# 0  1.0  4.0
# 1  NaN  5.0
# 2  3.0  NaN

# 删除缺失值
print(df_with_nan.dropna())
# 输出:
#      A    B
# 0  1.0  4.0

# 填充缺失值
print(df_with_nan.fillna(0))
# 输出:
#      A    B
# 0  1.0  4.0
# 1  0.0  5.0
# 2  3.0  0.0
业务应用:检查并填充缺失值
python 复制代码
# 合并后检查缺失值
full_data = pd.merge(pd.merge(orders, users, on='User_ID', how='left'), products, on='Product_ID', how='left')
print(full_data.isnull().sum())
full_data = full_data.fillna({'Region': 'Unknown'})  # 若有缺失区域,填为 Unknown

3.2 数据类型转换

  • df.astype(type): 转换列的数据类型。
  • pd.to_numeric(): 将列转换为数值。
python 复制代码
df['Age'] = df['Age'].astype(float)
print(df.dtypes)
# 输出:
# Name      object
# Age      float64
# Score      int64
# dtype: object
业务应用:转换日期类型
python 复制代码
orders['Order_Date'] = pd.to_datetime(orders['Order_Date'])
users['Join_Date'] = pd.to_datetime(users['Join_Date'])
print(orders.dtypes)
# 输出:
# Order_ID               int64
# User_ID                int64
# Product_ID             int64
# Quantity               int64
# Order_Date    datetime64[ns]
# dtype: object

4. 数据合并与连接

4.1 合并 (Merge)

类似 SQL 的 JOIN 操作。

python 复制代码
df1 = pd.DataFrame({'ID': [1, 2, 3], 'Name': ['Alice', 'Bob', 'Cathy']})
df2 = pd.DataFrame({'ID': [1, 2, 4], 'Score': [85, 90, 95]})
merged = pd.merge(df1, df2, on='ID', how='inner')
print(merged)
# 输出:
#    ID   Name  Score
# 0   1  Alice     85
# 1   2    Bob     90
业务应用:合并三张表
python 复制代码
orders_users = pd.merge(orders, users, on='User_ID', how='left')
full_data = pd.merge(orders_users, products, on='Product_ID', how='left')
print(full_data.head())
# 输出:
#    Order_ID  User_ID  Product_ID  Quantity Order_Date   Name Region  Join_Date Product_Name     Category  Price
# 0      1001        1         101         2 2023-01-05  Alice  North 2022-01-01       Laptop  Electronics   1000
# 1      1002        2         102         1 2023-01-06    Bob  South 2022-06-15        Mouse  Accessories     20
# ...

4.2 拼接 (Concat)

  • pd.concat([df1, df2], axis=0): 纵向拼接。
  • pd.concat([df1, df2], axis=1): 横向拼接。
python 复制代码
df3 = pd.DataFrame({'Name': ['David'], 'Age': [40], 'Score': [87]})
concat_df = pd.concat([df, df3], axis=0, ignore_index=True)
print(concat_df)
# 输出:
#     Name  Age  Score
# 0  Alice   25     85
# 1    Bob   30     90
# 2  Cathy   35     88
# 3  David   40     87

5. 数据聚合与分组

5.1 分组 (GroupBy)

python 复制代码
df['Class'] = ['A', 'B', 'A']
grouped = df.groupby('Class').mean()
print(grouped)
# 输出:
#             Age      Score
# Class                    
# A      30.000000  86.500000
# B      30.000000  90.000000
业务应用:按区域分组
python 复制代码
full_data['Total_Sales'] = full_data['Quantity'] * full_data['Price']
region_summary = full_data.groupby('Region').agg({
    'Total_Sales': 'sum',
    'Order_ID': 'count'
}).rename(columns={'Order_ID': 'Order_Count'})
print(region_summary)
# 输出:
#         Total_Sales  Order_Count
# Region                          
# East           1000            1
# North          2150            2
# South          1220            2

5.2 聚合函数

  • sum(), mean(), count(), max(), min() 等。
python 复制代码
print(df.groupby('Class')['Score'].agg(['mean', 'max']))
# 输出:
#            mean  max
# Class              
# A      86.500000   88
# B      90.000000   90
业务应用:产品类别分析
python 复制代码
category_summary = full_data.groupby('Category').agg({
    'Total_Sales': ['sum', 'mean'],
    'Quantity': 'sum'
})
category_summary.columns = ['Total_Sales_Sum', 'Avg_Sales_Per_Order', 'Total_Quantity']
print(category_summary)
# 输出:
#              Total_Sales_Sum  Avg_Sales_Per_Order  Total_Quantity
# Category                                                         
# Accessories              170            85.000000               4
# Electronics             4200          1400.000000               7

6. 数据重塑

6.1 透视表 (Pivot Table)

python 复制代码
df_pivot = pd.pivot_table(df, values='Score', index='Class', columns='Age', aggfunc='mean')
print(df_pivot)
# 输出:
# Age       25    30    35
# Class                   
# A       85.0   NaN  88.0
# B        NaN  90.0   NaN
业务应用:区域与类别透视表
python 复制代码
pivot_sales = pd.pivot_table(full_data, 
                            values='Total_Sales', 
                            index='Region', 
                            columns='Category', 
                            aggfunc='sum', 
                            fill_value=0)
print(pivot_sales)
# 输出:
# Category    Accessories  Electronics
# Region                            
# East                  0         1000
# North               150         2000
# South                20         1200

6.2 熔融 (Melt)

将宽表转为长表。

python 复制代码
melted = pd.melt(df, id_vars=['Name'], value_vars=['Age', 'Score'])
print(melted)
# 输出:
#     Name variable  value
# 0  Alice      Age     25
# 1    Bob      Age     30
# 2  Cathy      Age     35
# 3  Alice    Score     85
# 4    Bob    Score     90
# 5  Cathy    Score     88

7. 时间序列处理

7.1 创建时间索引

python 复制代码
dates = pd.date_range('2023-01-01', periods=6, freq='D')
df_time = pd.DataFrame({'Value': [10, 20, 15, 25, 30, 35]}, index=dates)
print(df_time)
# 输出:
#             Value
# 2023-01-01     10
# 2023-01-02     20
# 2023-01-03     15
# 2023-01-04     25
# 2023-01-05     30
# 2023-01-06     35
业务应用:设置订单时间索引
python 复制代码
full_data.set_index('Order_Date', inplace=True)

7.2 重采样

python 复制代码
weekly = df_time.resample('W').mean()
print(weekly)
# 输出:
#             Value
# 2023-01-01   10.0
# 2023-01-08   23.0
业务应用:按月销售趋势
python 复制代码
sales_trend = full_data['Total_Sales'].resample('M').sum()
print(sales_trend)
# 输出:
# Order_Date
# 2023-01-31    2020
# 2023-02-28    1150
# 2023-03-31    1200
# Freq: M, Name: Total_Sales, dtype: int64

8. 实用技巧

8.1 排序

  • df.sort_values('列名'): 按列排序。
  • df.sort_index(): 按索引排序。
python 复制代码
print(df.sort_values('Score', ascending=False))
# 输出:
#     Name  Age  Score Class
# 1    Bob   30     90     B
# 2  Cathy   35     88     A
# 0  Alice   25     85     A
业务应用:畅销产品排名
python 复制代码
top_products = full_data.groupby('Product_Name')['Total_Sales'].sum().sort_values(ascending=False)
print(top_products)
# 输出:
# Product_Name
# Laptop      3000
# Monitor     1200
# Keyboard     150
# Mouse         20
# Name: Total_Sales, dtype: int64

8.2 去重

  • df.drop_duplicates(): 删除重复行。
python 复制代码
df_duplicated = pd.concat([df, df.iloc[0:1]], axis=0)
print(df_duplicated.drop_duplicates())
# 输出:
#     Name  Age  Score Class
# 0  Alice   25     85     A
# 1    Bob   30     90     B
# 2  Cathy   35     88     A

9. 完整业务实现代码

以下是将上述操作整合为一个完整的分析脚本:

python 复制代码
import pandas as pd
import numpy as np

# 数据准备
orders = pd.DataFrame({
    'Order_ID': [1001, 1002, 1003, 1004, 1005],
    'User_ID': [1, 2, 1, 3, 2],
    'Product_ID': [101, 102, 103, 101, 104],
    'Quantity': [2, 1, 3, 1, 4],
    'Order_Date': ['2023-01-05', '2023-01-06', '2023-02-01', '2023-02-15', '2023-03-01']
})
users = pd.DataFrame({
    'User_ID': [1, 2, 3, 4],
    'Name': ['Alice', 'Bob', 'Cathy', 'David'],
    'Region': ['North', 'South', 'East', 'West'],
    'Join_Date': ['2022-01-01', '2022-06-15', '2021-12-10', '2023-01-20']
})
products = pd.DataFrame({
    'Product_ID': [101, 102, 103, 104],
    'Product_Name': ['Laptop', 'Mouse', 'Keyboard', 'Monitor'],
    'Category': ['Electronics', 'Accessories', 'Accessories', 'Electronics'],
    'Price': [1000, 20, 50, 300]
})

# 数据预处理
orders['Order_Date'] = pd.to_datetime(orders['Order_Date'])
users['Join_Date'] = pd.to_datetime(users['Join_Date'])

# 合并数据
orders_users = pd.merge(orders, users, on='User_ID', how='left')
full_data = pd.merge(orders_users, products, on='Product_ID', how='left')
full_data['Total_Sales'] = full_data['Quantity'] * full_data['Price']
full_data = full_data.fillna({'Region': 'Unknown'})

# 分析
sales_trend = full_data.set_index('Order_Date')['Total_Sales'].resample('M').sum()
region_summary = full_data.groupby('Region').agg({'Total_Sales': 'sum', 'Order_ID': 'count'}).rename(columns={'Order_ID': 'Order_Count'})
category_summary = full_data.groupby('Category').agg({'Total_Sales': ['sum', 'mean'], 'Quantity': 'sum'})
category_summary.columns = ['Total_Sales_Sum', 'Avg_Sales_Per_Order', 'Total_Quantity']
pivot_sales = pd.pivot_table(full_data, values='Total_Sales', index='Region', columns='Category', aggfunc='sum', fill_value=0)
top_products = full_data.groupby('Product_Name')['Total_Sales'].sum().sort_values(ascending=False)

# 输出结果
print("按月销售趋势:\n", sales_trend)
print("\n区域销售概要:\n", region_summary)
print("\n产品类别表现:\n", category_summary)
print("\n区域与类别销售透视表:\n", pivot_sales)
print("\n畅销产品排名:\n", top_products)

10. 总结

通过本指南,你学习了 Pandas 的核心操作,并通过一个电商销售数据分析案例应用了这些知识。以下是关键点:

  • 数据结构:创建和管理 Series 和 DataFrame。
  • 数据操作:查看、切片、清洗和转换数据。
  • 合并与分组:处理多表数据并进行聚合分析。
  • 时间序列与重塑:分析趋势和生成透视表。
  • 业务应用:将理论知识转化为实际问题解决能力。

建议多运行代码,理解每步输出,并在考试前练习类似的多表分析题目。祝你期末考试顺利!

相关推荐
uzong4 小时前
技术故障复盘模版
后端
GetcharZp4 小时前
基于 Dify + 通义千问的多模态大模型 搭建发票识别 Agent
后端·llm·agent
桦说编程5 小时前
Java 中如何创建不可变类型
java·后端·函数式编程
IT毕设实战小研5 小时前
基于Spring Boot 4s店车辆管理系统 租车管理系统 停车位管理系统 智慧车辆管理系统
java·开发语言·spring boot·后端·spring·毕业设计·课程设计
wyiyiyi5 小时前
【Web后端】Django、flask及其场景——以构建系统原型为例
前端·数据库·后端·python·django·flask
阿华的代码王国6 小时前
【Android】RecyclerView复用CheckBox的异常状态
android·xml·java·前端·后端
Jimmy6 小时前
AI 代理是什么,其有助于我们实现更智能编程
前端·后端·ai编程
AntBlack7 小时前
不当韭菜V1.1 :增强能力 ,辅助构建自己的交易规则
后端·python·pyqt
bobz9658 小时前
pip install 已经不再安全
后端
寻月隐君8 小时前
硬核实战:从零到一,用 Rust 和 Axum 构建高性能聊天服务后端
后端·rust·github