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

siotufzp  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(69)

我有一个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个架次中的一个架次中,其余的行依此类推。
这可以做到吗?

4xrmg8kj

4xrmg8kj1#

您可以确保行按SortieNumberDateTime排序,然后删除相同的连续SortieNumber/CustomerNamegroupby.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=Truevalue_counts

CustomerName
Josh-Alice-Robert    0.666667
Anna-Robert          0.333333
Name: proportion, dtype: float64

3xiyfsfu

3xiyfsfu2#

import pandas as pd

df = pd.DataFrame({
    'DateTime': pd.to_datetime(['01/01/2023 09:00:00', '01/01/2023 09:10:00', '01/01/2023 09:15:00',
                               '01/01/2023 12:00:00', '01/01/2023 12:00:10', '01/01/2023 12:15:00',
                               '01/01/2023 15:00:00', '01/01/2023 15:05:10', '01/01/2023 15:15:00',
                               '01/01/2023 15:30:10', '01/01/2023 15:35:15']),
    'SortieNumber': [1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3],
    'CustomerName': ['Josh', 'Alice', 'Robert', 'Anna', 'Anna', 'Robert', 'Josh', 'Alice', 
                     'Robert', 'Robert', 'Robert'],
    'ProductCode': ['001', '002', '002', '001', '003', '003', '004', '003', '001', '002', '003']
})

aa = df.groupby('SortieNumber')['CustomerName'].agg(lambda x: '-'.join(x.drop_duplicates()))

# Count occurrences 
chain_counts = aa.value_counts()
"""
CustomerName
Josh-Alice-Robert    2
Anna-Robert          1
Name: count, dtype: int64
"""

字符串

相关问题