如何从Pandas DataFrame中提取客户配送链并统计出现频次?
客户配送链统计实现方案
完全可以实现,以下是具体步骤和代码:
步骤1:生成各配送任务的客户顺序链
首先确保每个配送任务(SortieNumber)内的记录按配送时间(DateTime)排序,再将任务内的客户名称按顺序拼接成字符串形式的客户链(忽略ProductCode列)。
import pandas as pd # 按配送任务号和时间排序,保证客户顺序符合实际配送流程 df_sorted = df.sort_values(['SortieNumber', 'DateTime']) # 分组拼接每个任务的客户链 customer_chains = df_sorted.groupby('SortieNumber')['CustomerName'].apply(lambda x: '-'.join(x)).reset_index(name='CustomerChain')
步骤2:统计每条客户链的任务出现次数
对生成的客户链进行计数,得到每条链在多少个配送任务中出现:
# 统计链的出现次数,并格式化结果 chain_counts = customer_chains['CustomerChain'].value_counts().reset_index() chain_counts.columns = ['CustomerChain', 'OccurrenceCount']
示例效果
假设你的原始数据如下:
| DateTime | SortieNumber | CustomerName | ProductCode |
|---|---|---|---|
| 2024-05-01 08:00 | S001 | Josh | P001 |
| 2024-05-01 08:30 | S001 | Alice | P002 |
| 2024-05-01 09:00 | S001 | Robert | P003 |
| 2024-05-01 09:30 | S002 | Josh | P001 |
| 2024-05-01 10:00 | S002 | Alice | P002 |
| 2024-05-01 10:30 | S002 | Robert | P003 |
| 2024-05-01 11:00 | S003 | Alice | P002 |
| 2024-05-01 11:30 | S003 | Robert | P003 |
运行代码后,chain_counts的结果为:
| CustomerChain | OccurrenceCount |
|---|---|
| Josh-Alice-Robert | 2 |
| Alice-Robert | 1 |
这正好匹配你示例中"Josh-Alice-Robert在3次任务里出现2次"的需求。
可选调整
如果需要忽略同一配送任务内重复出现的客户(比如同一客户多次配送只保留一次),可以修改拼接逻辑为:
customer_chains = df_sorted.groupby('SortieNumber')['CustomerName'].apply(lambda x: '-'.join(x.unique())).reset_index(name='CustomerChain')
内容的提问来源于stack exchange,提问作者slow_learner
相关产品推荐
相关产品推荐

