如何从 Pandas 数据框中提取客户链?

问题描述 投票:0回答:1

我有一个 pandas 数据框,其中包含有关送货员送货的信息。在这个 pandas 数据框中有四列。第一个是

DateTime
,第二个是
SortieNumber
,第三个是
CustomerName
,第四个是
ProductCode

我想研究这个 pandas 数据框并找到其中的链。我想知道这位送货员在每次出击中是否以相同的顺序向相同的客户送货。我不关心订购的产品。 数据框的第一行是这样的:

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

从这些数据中,我想说,链

Josh-Alice-Robert
发生在 3 架次中的 2 架次中,
Anna-Robert
发生在 3 架次中的 1 架次中,对于剩余的行依此类推。

这可以吗?

python pandas database dataframe series
1个回答
0
投票

您可以确保行按

SortieNumber
DateTime
排序,然后删除相同的连续
SortieNumber
/
CustomerName
groupby.aggregate
作为字符串和
value_counts
:

(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()
)

注意。如果您确定在一个

SortieNumber
内,同一客户永远不会与另一位客户在其间交付,您可以将
.loc[…]
简化为
.drop_duplicates(['SortieNumber', 'CustomerName'])

输出:

CustomerName
Josh-Alice-Robert    2
Anna-Robert          1
Name: count, dtype: int64

如果您想要比例,请将

normalize=True
传递给
value_counts

CustomerName
Josh-Alice-Robert    0.666667
Anna-Robert          0.333333
Name: proportion, dtype: float64
© www.soinside.com 2019 - 2024. All rights reserved.