我有一个 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 架次中,对于剩余的行依此类推。
这可以吗?
您可以确保行按
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