2.Pandas在电商数据处理中的核心价值
第1章 Pandas在电商数据处理中应用
1.1 为什么Excel不够用,需要Pandas
Pandas是Python里的数据分析核心库。它的名字来自“Panel Data”(面板数据),专门处理表格型数据。电商数据分析里,Pandas主要解决三类问题:
-
百万级数据快速处理:Excel打不开的文件,Pandas轻松读
-
复杂数据清洗:缺失值、重复值、异常值,一行代码搞定
-
灵活的数据聚合:按店铺、类目、时间任意分组统计
学Pandas不需要懂底层原理,把它当成“Excel的Python版”就行。你会的筛选、排序、透视表,Pandas都能做,而且快得多。
1.2 学习前的准备工作
1.2.1 安装Pandas
在上一章你已经装了Python,现在安装Pandas和配套库。
步骤1:打开命令行
-
Windows:按
Win + R,输入cmd,回车 -
Mac:打开“终端”
步骤2:执行安装命令
pip install pandas numpy openpyxl
-
pandas:核心数据处理库 -
numpy:Pandas依赖的数值计算库 -
openpyxl:用于读写Excel文件
步骤3:验证安装
在命令行输入python,进入Python交互环境,然后输入:
import pandas as pd
print(pd.__version__)
如果输出版本号(如2.0.3),说明安装成功。
[图1-1 命令行安装Pandas成功截图]
我第一次装Pandas时,直接用pip install pandas,结果报错“pip不是内部命令”。后来发现是Python安装时没勾选“Add to PATH”。如果你也遇到这个问题,可以回到第一章重装Python,或者用python -m pip install pandas。
1.2.2 准备电商测试数据
为了本教程的实操,你需要一份订单CSV文件。我建议生成一份10万行的模拟数据,这样能真实感受Pandas的速度。
生成模拟数据的代码(复制到Jupyter运行):
import pandas as pd
import numpy as np
np.random.seed(42)
n = 100000
df = pd.DataFrame({
'order_id': ['ORD' + str(i).zfill(8) for i in range(1, n+1)],
'user_id': np.random.randint(10000, 99999, n),
'shop_name': np.random.choice(['时尚女装旗舰店', '潮流男装专营店', '美妆优选', '数码极客'], n),
'category': np.random.choice(['连衣裙', '上衣', '裤子', '护肤品', '手机'], n),
'amount': np.random.uniform(10, 2000, n).round(2),
'status': np.random.choice(['已支付', '已取消', '已完成'], n, p=[0.7, 0.1, 0.2]),
'order_date': pd.date_range('2025-01-01', periods=n, freq='min')
})
df.to_csv('orders_100k.csv', index=False)
print("已生成 orders_100k.csv,共10万行")
运行后,当前目录下会生成orders_100k.csv文件,约5-10MB。
模拟数据不涉及真实用户,可以放心使用。如果是公司真实数据,必须先脱敏:用户ID随机化、金额去掉尾数、时间模糊处理。
第2章 Pandas核心数据结构:Series与DataFrame
2.1 DataFrame:Excel表格的Python版
Pandas最核心的概念是DataFrame,你可以把它理解成一张Excel表格。它由行和列组成,每列可以有不同的数据类型。
创建一个简单的DataFrame:
import pandas as pd
data = {
'订单号': ['ORD001', 'ORD002', 'ORD003'],
'金额': [299, 599, 89],
'状态': ['已支付', '已支付', '已取消']
}
df = pd.DataFrame(data)
print(df)
输出:
订单号 金额 状态
0 ORD001 299 已支付
1 ORD002 599 已支付
2 ORD003 89 已取消
2.2 Series:DataFrame的一列
Series是DataFrame的一列,可以单独操作。
提取一列:
amount_series = df['金额']
print(amount_series)
print(type(amount_series)) # <class 'pandas.core.series.Series'>
Series的常用操作:
print(amount_series.mean()) # 平均值
print(amount_series.sum()) # 总和
print(amount_series.max()) # 最大值
⚠️ 实操避坑提醒:DataFrame的列名是大小写敏感的。df['金额']和df['金额 '](多一个空格)是不同的。我遇到过因为Excel列名有不可见空格,导致筛选失败的情况。建议用df.columns查看所有列名,确认准确写法。
第3章 数据读取:read_csv与read_excel
3.1 读取CSV文件
电商场景:读取上一节生成的orders_100k.csv。
步骤1:读取文件
import pandas as pd
df = pd.read_csv('orders_100k.csv')
print(f"数据形状:{df.shape}") # (100000, 7)
print(f"列名:{df.columns.tolist()}")
步骤2:查看前几行,确认读取正确
df.head()
常用参数:
-
encoding:指定编码,中文CSV常用encoding='utf-8'或'gbk' -
dtype:指定列的数据类型,如dtype={'user_id': str} -
parse_dates:自动解析日期列,如parse_dates=['order_date']
完整示例:
df = pd.read_csv('orders_100k.csv',
encoding='utf-8',
parse_dates=['order_date'])
3.2 读取Excel文件
电商场景:运营发来的报表可能是Excel格式。
df_excel = pd.read_excel('店铺报表.xlsx', sheet_name='Sheet1')
需要安装openpyxl:pip install openpyxl
3.3 读取多个文件并合并
电商场景:多个店铺的订单文件,需要合并成一个DataFrame。
import glob
# 获取所有CSV文件
files = glob.glob('orders_*.csv')
df_list = []
for f in files:
temp = pd.read_csv(f)
df_list.append(temp)
df_all = pd.concat(df_list, ignore_index=True)
print(f"合并后总行数:{len(df_all)}")
我的踩坑经历:有一次合并12个月的报表,直接用pd.concat,结果发现数据行数比预期少了很多。排查后发现,其中一个月报表的列名末尾多了个空格,导致Pandas没匹配上,把该月数据单独成了一列。从那以后,我合并前会统一用df.columns = df.columns.str.strip()清理列名空格。
第4章 数据概览:快速了解订单数据质量
拿到数据后,第一件事不是马上分析,而是先“把脉”——了解数据有多少行、有哪些列、有没有空值、各列是什么类型。
4.1 head()与tail():看头看尾
df.head(10) # 前10行
df.tail(5) # 后5行
4.2 shape:数据维度
rows, cols = df.shape
print(f"{rows}行,{cols}列")
# 输出:100000行,7列
4.3 info():列类型与非空值
df.info()
输出示例:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 100000 entries, 0 to 99999
Data columns (total 7 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 order_id 100000 non-null object
1 user_id 100000 non-null int64
2 shop_name 100000 non-null object
3 category 99950 non-null object # 有50个空值
4 amount 100000 non-null float64
5 status 100000 non-null object
6 order_date 100000 non-null datetime64[ns]
dtypes: datetime64[ns](1), float64(1), int64(1), object(4)
memory usage: 5.3+ MB
关键信息解读:
-
Non-Null Count:非空值数量,如果小于总行数,说明该列有缺失值 -
Dtype:数据类型,object通常表示文本,int64/float64是数字,datetime64是日期 -
上例中
category列有50个空值,需要后续处理
4.4 describe():数值列的统计摘要
df.describe()
输出:
user_id amount
count 100000.000000 100000.000000
mean 54923.456789 987.65
std 25987.123456 567.89
min 10000.000000 10.12
25% 32456.000000 498.00
50% 54923.000000 987.00
75% 77456.000000 1489.00
max 99999.000000 1999.99
解读:
-
count:非空数量,如果少于总行数,说明有缺失 -
mean:平均值 -
std:标准差,越大说明数据越分散 -
min/max:最小/最大值,可以快速发现异常值(比如金额为负数)
4.5 检查缺失值的更直接方法
df.isnull().sum()
输出:
order_id 0
user_id 0
shop_name 0
category 50
amount 0
status 0
order_date 0
dtype: int64
⚠️ 实操避坑提醒:describe()默认只统计数值列。如果想看所有列(包括文本)的统计,可以用df.describe(include='all')。我当初不知道这个参数,以为文本列统计不了,后来才发现。
第5章 数据筛选与选择
5.1 按列名选择
选择单列(返回Series):
df['amount'] # 推荐写法
df.amount # 也可以,但列名有空格或特殊字符时会报错
选择多列(返回DataFrame):
df[['order_id', 'amount', 'status']]
5.2 按行索引选择
前5行:
df[:5] # 相当于df.head()
指定行范围:
df[10:20] # 第11行到第20行(0索引)
5.3 loc与iloc:更强大的选择方式
loc:按标签(行名、列名)选择iloc:按位置(行号、列号)选择
loc示例:
# 选择第0行到第4行,以及'order_id'和'amount'列
df.loc[0:4, ['order_id', 'amount']]
iloc示例:
# 选择前5行,前2列
df.iloc[0:5, 0:2]
5.4 条件筛选(最常用)
电商场景:筛选出“已支付”且金额大于500的订单。
filtered = df[(df['status'] == '已支付') & (df['amount'] > 500)]
print(f"符合条件的订单数:{len(filtered)}")
多个条件:
# 已支付 或 已完成
df[df['status'].isin(['已支付', '已完成'])]
# 金额在100到500之间
df[(df['amount'] >= 100) & (df['amount'] <= 500)]
电商场景:筛选出“时尚女装旗舰店”的订单,并只保留订单号、金额、日期三列。
df_shop = df[df['shop_name'] == '时尚女装旗舰店'][['order_id', 'amount', 'order_date']]
我的踩坑经历:写多个条件时,我经常忘记用括号把每个条件括起来,比如df[df['amount'] > 100 & df['status'] == '已支付'],结果报错。正确写法是df[(df['amount'] > 100) & (df['status'] == '已支付')]。每个条件独立括号,条件之间用&(且)或|(或)。
第6章 综合实操案例:10万行订单数据快速探查
6.1 案例背景
你拿到了orders_100k.csv,需要在10分钟内完成数据质量检查,并筛选出高价值订单(已支付且金额≥500元)供运营同事分析。
6.2 分步操作
步骤1:读取数据并快速预览
import pandas as pd
df = pd.read_csv('orders_100k.csv', parse_dates=['order_date'])
print(df.shape)
df.head()
步骤2:检查数据质量
# 1. 查看列类型和缺失值
df.info()
# 2. 查看数值列统计
df.describe()
# 3. 专门检查缺失值数量
df.isnull().sum()
# 4. 检查是否有重复订单号
print(f"重复订单数:{df['order_id'].duplicated().sum()}")
步骤3:筛选高价值订单
high_value = df[(df['status'] == '已支付') & (df['amount'] >= 500)]
print(f"高价值订单数:{len(high_value)}")
print(f"高价值订单总金额:{high_value['amount'].sum():.2f}")
步骤4:按店铺统计高价值订单的GMV
gmv_by_shop = high_value.groupby('shop_name')['amount'].sum().sort_values(ascending=False)
print(gmv_by_shop)
步骤5:保存筛选结果
high_value.to_csv('high_value_orders.csv', index=False)
print("已保存到 high_value_orders.csv")
6.3 预期结果示例
数据形状:(100000, 7)
重复订单数:0
高价值订单数:28340
高价值订单总金额:18765432.50
shop_name
时尚女装旗舰店 5876543.20
潮流男装专营店 5123456.80
美妆优选 4321098.50
数码极客 3454321.00
Name: amount, dtype: float64
第7章 本章踩坑清单与合规总结
7.1 新手常见踩坑
| 场景 | 错误操作 | 正确做法 |
|---|---|---|
| 读取CSV | 中文乱码 | 指定encoding='utf-8'或'gbk' |
| 列名访问 | df.订单号(有空格或中文) |
用df['订单号'] |
| 条件筛选 | 多个条件不用括号 | (条件1) & (条件2) |
| 查看缺失值 | 用肉眼扫 | df.isnull().sum() |
| 重复值 | 没检查就直接用 | df.duplicated().sum() |
| [图7-1 踩坑汇总表格图] |
第8章 结语
Pandas的read_csv、info、describe、条件筛选是电商数据分析最常用的操作。掌握它们,你就能快速了解任何一份订单数据的质量,并筛选出需要重点分析的部分。
下一章我会讲「Pandas数据清洗——缺失值、重复值、异常值处理」,教你如何处理真实订单数据中的脏数据。
有问题的评论区留言,我看到会回复。
更多推荐




所有评论(0)