如何从 pandas 数据框中提取名称子链

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

这个问题之后,我有以下代码能够在每次送货人员出差的数据库中查找客户链。

import pandas as pd

data = {
    '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', '01/01/2023 18:00:00', 
                 '01/01/2023 18:00:00', '01/01/2023 18:00:00', '01/01/2023 18:00:00'
                 , '01/01/2023 18:00:00'],
    'SortieNumber': [1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4],
    'CustomerName': ['Josh', 'Alice', 'Robert',
                      'Anna', 'Anna', 'Robert',
                        'Josh', 'Alice', 'Robert', 'Robert', 'Robert',
                          'Josh', 'Alice', 'Robert', 'Anna', 'Anna'],
    'ProductCode': ['001', '002', '002', '001', '003', '003', '004', '003', '001', '002', '003', '003', '003', '003', '003', '003']
}
df = pd.DataFrame(data)
a=df.sort_values(by=['SortieNumber', 'DateTime'])
a=a.loc[lambda d: d[['SortieNumber', 'CustomerName']].ne(d[['SortieNumber', 'CustomerName']].shift()).any(axis=1)]
a=a.groupby('SortieNumber')['CustomerName'].agg('-'.join).value_counts(normalize=True)
print(a)

这段代码的输出是

Josh-Alice-Robert         0.50
Anna-Robert               0.25
Josh-Alice-Robert-Anna    0.25
Name: CustomerName, dtype: float64

它可以与小型数据库一起使用,例如上面示例代码中提供的数据库。

但是,我想修改此代码以考虑子链,例如,我想

Josh-Alice-Robert         0.75
Josh-Alice                0.75
Alice-Robert              0.75
Anna-Robert               0.25
Robert-Anna               0.25
Josh-Alice-Robert-Anna    0.25
Name: CustomerName, dtype: float64

作为输出,因为我希望链

Josh-Alice-Robert
存在
Josh-Alice-Robert-Anna
以及
Josh-Alice-Robert
链被考虑。

这可以吗?

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

我希望我正确理解了你的问题:

def my_func(g):
    d = dict.fromkeys(g["CustomerName"])
    chain = list(d)

    out = {"-".join(chain)}
    for idx in range(len(chain) - 1):
        out.add("-".join(chain[idx : idx + 2]))

    return out


df = df.sort_values(by=["SortieNumber", "DateTime"])
out = df.groupby("SortieNumber").apply(my_func).explode().value_counts(normalize=True)
print(out)

打印:

Josh-Alice                0.272727
Alice-Robert              0.272727
Josh-Alice-Robert         0.181818
Anna-Robert               0.090909
Robert-Anna               0.090909
Josh-Alice-Robert-Anna    0.090909
Name: proportion, dtype: float64
© www.soinside.com 2019 - 2024. All rights reserved.