0

0

如何从Pandas DataFrame中提取并分析客户访问链

心靈之曲

心靈之曲

发布时间:2025-07-31 21:42:01

|

963人浏览过

|

来源于php中文网

原创

如何从pandas dataframe中提取并分析客户访问链

本教程详细介绍了如何利用Pandas库从配送数据中提取并统计客户访问链。通过对数据进行排序、智能去重、分组聚合以及计数,可以有效地识别出在不同配送批次(SortieNumber)中重复出现的客户访问顺序模式,从而深入理解配送行为。

在物流配送或客户服务场景中,我们经常需要分析客户的访问顺序模式。例如,一个配送员在一次配送任务(Sortie)中,是否总是按照相同的客户顺序进行派送?识别这些重复的客户访问链对于优化路线、理解客户行为或评估配送效率至关重要。本文将指导您如何使用Pandas处理这类问题,从原始配送数据中提取并统计这些客户访问链。

数据准备与理解

假设我们有一个Pandas DataFrame,其中包含了配送人员的配送信息。这个DataFrame包含以下核心列:

  • DateTime: 配送时间,用于确定客户访问的先后顺序。
  • SortieNumber: 配送批次号,标识一次独立的配送任务。
  • CustomerName: 客户名称。
  • ProductCode: 配送的产品代码(在此分析中不关心)。

我们的目标是找出在每个SortieNumber中,客户的访问顺序(即客户链),并统计每种客户链出现的次数。产品代码在此分析中不重要,我们只关注客户的访问顺序。

以下是示例数据结构:

   DateTime  SortieNumber CustomerName  ProductCode
0 01/01/2023 09:00:00             1         Josh          1
1 01/01/2023 09:10:00             1        Alice          2
2 01/01/2023 09:15:00             1       Robert          2
3 01/01/2023 12:00:00             2         Anna          1
4 01/01/2023 12:00:10             2         Anna          3
5 01/01/2023 12:15:00             2       Robert          3
6 01/01/2023 15:00:00             3         Josh          4
7 01/01/2023 15:05:10             3        Alice          3
8 01/01/2023 15:15:00             3       Robert          1
9 01/01/2023 15:30:10             3       Robert          2
10 01/01/2023 15:35:15             3       Robert          3

从上述数据中,我们期望得到类似“Josh-Alice-Robert”这样的客户链在3次配送中出现了2次,“Anna-Robert”出现了1次。

核心逻辑:提取客户链

为了实现上述目标,我们将采用以下步骤:

步骤一:数据排序

首先,确保数据按照SortieNumber和DateTime进行升序排列。这是构建正确客户访问顺序的基础。

df_sorted = df.sort_values(by=['SortieNumber', 'DateTime'])

步骤二:去除连续重复客户

在同一个SortieNumber中,如果一个客户被连续访问多次(例如,Anna-Anna或Robert-Robert-Robert),我们通常只希望在客户链中记录一次。这是因为我们关心的是客户访问的顺序,而不是每个客户被访问了多少次。为了实现这一点,我们需要过滤掉那些SortieNumber和CustomerName都与上一行完全相同的记录。

Akkio
Akkio

Akkio 是一个无代码 AI 的全包平台,任何人都可以在几分钟内构建和部署AI

下载

使用df[['SortieNumber', 'CustomerName']].ne(df[['SortieNumber', 'CustomerName']].shift()).any(axis=1)是一种健壮的方法:

  • df[['SortieNumber', 'CustomerName']].shift(): 获取前一行的SortieNumber和CustomerName。
  • .ne(): 比较当前行与前一行是否不相等。
  • .any(axis=1): 如果SortieNumber或CustomerName中的任意一个与前一行不相等,则返回True。这意味着要么是一个新的配送批次开始了,要么是同一批次中访问了一个新的客户。只有当两者都相等时,才返回False,从而过滤掉连续重复的客户条目。
df_filtered = df_sorted.loc[lambda d: d[['SortieNumber', 'CustomerName']]
                                     .ne(d[['SortieNumber', 'CustomerName']].shift())
                                     .any(axis=1)]

经过这一步,像Anna-Anna这样的连续重复项会被处理为Anna,而Josh-Alice-Robert-Robert-Robert会被处理为Josh-Alice-Robert。但如果客户是非连续重复的,例如Josh-Alice-Robert-Alice,则会被保留为完整的链。

步骤三:构建客户链

现在,我们按SortieNumber对过滤后的数据进行分组,并使用agg('-'.join)将每个组内的CustomerName连接成一个以连字符分隔的字符串,形成客户链。

customer_chains = df_filtered.groupby('SortieNumber')['CustomerName'].agg('-'.join)

步骤四:统计客户链出现次数

最后,使用value_counts()方法统计每种唯一客户链出现的次数。

chain_counts = customer_chains.value_counts()

步骤五:计算比例(可选)

如果您想了解每种客户链占总配送批次的比例,可以在value_counts()中传入normalize=True参数。

chain_proportions = customer_chains.value_counts(normalize=True)

完整代码示例

将上述步骤整合,形成完整的Python代码:

import pandas as pd
from io import StringIO

# 示例数据
data = """DateTime,SortieNumber,CustomerName,ProductCode
01/01/2023 09:00:00,1,Josh,001
01/01/2023 09:10:00,1,Alice,002
01/01/2023 09:15:00,1,Robert,002
01/01/2023 12:00:00,2,Anna,001
01/01/2023 12:00:10,2,Anna,003
01/01/2023 12:15:00,2,Robert,003
01/01/2023 15:00:00,3,Josh,004
01/01/2023 15:05:10,3,Alice,003
01/01/2023 15:15:00,3,Robert,001
01/01/2023 15:30:10,3,Robert,002
01/01/2023 15:35:15,3,Robert,003
"""

df = pd.read_csv(StringIO(data))
# 确保DateTime列为日期时间类型,以便正确排序
df['DateTime'] = pd.to_datetime(df['DateTime'])

# 提取客户链并统计出现次数
chain_analysis_results = (df.sort_values(by=['SortieNumber', 'DateTime'])
                            .loc[lambda d: d[['SortieNumber', 'CustomerName']]
                                          .ne(d[['SortieNumber', 'CustomerName']].shift())
                                          .any(axis=1)]
                            .groupby('SortieNumber')['CustomerName'].agg('-'.join)
                            .value_counts()
                           )

print("客户链出现次数:")
print(chain_analysis_results)

# 计算客户链出现的比例
chain_proportion_results = (df.sort_values(by=['SortieNumber', 'DateTime'])
                               .loc[lambda d: d[['SortieNumber', 'CustomerName']]
                                             .ne(d[['SortieNumber', 'CustomerName']].shift())
                                             .any(axis=1)]
                               .groupby('SortieNumber')['CustomerName'].agg('-'.join)
                               .value_counts(normalize=True)
                              )

print("\n客户链出现比例:")
print(chain_proportion_results)

输出结果:

客户链出现次数:
CustomerName
Josh-Alice-Robert    2
Anna-Robert          1
Name: count, dtype: int64

客户链出现比例:
CustomerName
Josh-Alice-Robert    0.666667
Anna-Robert          0.333333
Name: proportion, dtype: float64

注意事项与最佳实践

  1. 数据类型与排序: 确保时间戳列被正确解析为Pandas的datetime类型,这是正确排序和确定顺序的关键。
  2. 去重逻辑的选择:
    • 本文采用的ne(d.shift()).any(axis=1)方法是处理连续重复客户的推荐方式,它确保了在同一SortieNumber内,只有当客户名称发生变化时,才计入新的链条元素。这忠实地反映了客户访问的实际顺序。
    • 如果使用drop_duplicates(['SortieNumber', 'CustomerName']),它会移除同一SortieNumber中所有后续出现的相同客户,即使这些出现不是连续的。例如,如果链是Josh-Alice-Robert-Alice,drop_duplicates会将其简化为Josh-Alice-Robert,这可能与您想要保留完整顺序的需求不符。因此,请根据您的具体业务需求选择合适的去重策略。
  3. **性能考虑

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

61

2025.12.04

数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

309

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

222

2025.10.31

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

298

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

212

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1502

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

624

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

633

2024.03.22

java入门学习合集
java入门学习合集

本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。

1

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 3.6万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号