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

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

相关推荐
Source.Liu9 分钟前
【学Rust写CAD】27 双线性插值函数(bilinear_interpolation.rs)
后端·rust·cad
yinhezhanshen13 分钟前
理解rust里面的copy和clone
开发语言·后端·rust
uhakadotcom21 分钟前
Helm 简介与实践指南
后端·面试·github
栗筝i31 分钟前
Spring 核心技术解析【纯干货版】- XIX:Spring 日志模块 Spring-Jcl 模块精讲
java·后端·spring
企鹅不耐热.1 小时前
Scala基础知识6
开发语言·后端·scala
程序员一诺1 小时前
【Django开发】前后端分离django美多商城项目第15篇:商品搜索,1. Haystack介绍和安装配置【附代码文档】
后端·python·django·框架
冷琅辞2 小时前
Go语言的嵌入式网络
开发语言·后端·golang
跟着珅聪学java4 小时前
spring boot +Elment UI 上传文件教程
java·spring boot·后端·ui·elementui·vue
徐小黑ACG5 小时前
GO语言 使用protobuf
开发语言·后端·golang·protobuf
战族狼魂8 小时前
CSGO 皮肤交易平台后端 (Spring Boot) 代码结构与示例
java·spring boot·后端