第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')

需要安装openpyxlpip 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_csvinfodescribe、条件筛选是电商数据分析最常用的操作。掌握它们,你就能快速了解任何一份订单数据的质量,并筛选出需要重点分析的部分。

下一章我会讲「Pandas数据清洗——缺失值、重复值、异常值处理」,教你如何处理真实订单数据中的脏数据。

有问题的评论区留言,我看到会回复。

Logo

电商企业物流数字化转型必备!快递鸟 API 接口,72 小时快速完成物流系统集成。全流程实战1V1指导,营造开放的API技术生态圈。

更多推荐