【问题标题】:Labeling customers from transactional dataframe (pandas)从交易数据框(熊猫)中标记客户
【发布时间】:2018-04-25 19:47:47
【问题描述】:

我正在为购买了“X”的客户处理交易数据集。逻辑如下:

如果客户在购买项目“X”(例如 custID 1)之前有购买历史记录,则将该客户标记为“很棒”

如果客户只购买了 X 一次(例如 custID 2、3),则将该客户标记为“boo”

如果客户第一次购买 X,然后又购买了其他商品(例如 custID 4),则将该客户标记为“很棒”

我想用 python 写这个函数。任何建议将不胜感激。

电流输出:

list = [(1, 111, '2016-01-10', 'A'), (1, 112, '2016-02-02', 'B'), (1, 112, '2016-02-02', 'C'), (1, 113, '2016-04-10', 'X'), (2, 211, '2016-02-02', 'X'), 
        (3, 311, '2016-04-05', 'X'), (4, 411, '2016-02-05', 'X'), (4, 411, '2016-02-05', 'C'), (4, 412, '2016-03-10', 'E'), (4, 413, '2016-07-14', 'E')]
labels = ['custID', 'transacID', 'orderDate', 'itemDescription']
df = pd.DataFrame.from_records(list, columns=labels)
df
      custID transacID orderDate itemDescription
0       1        111  2016-01-10               A
1       1        112  2016-02-02               B
2       1        112  2016-02-02               C
3       1        113  2016-04-10               X
4       2        211  2016-02-02               X
5       3        311  2016-04-05               X
6       4        411  2016-02-05               X
7       4        411  2016-02-05               C
8       4        412  2016-03-10               E
9       4        413  2016-07-14               E

预期输出:

      custID transacID orderDate itemDescription  label
0       1        111  2016-01-10               A  great
1       1        112  2016-02-02               B  great
2       1        112  2016-02-02               C  great
3       1        113  2016-04-10               X  great
4       2        211  2016-02-02               X  boo
5       3        311  2016-04-05               X  boo
6       4        411  2016-02-05               X  awesome
7       4        411  2016-02-05               C  awesome
8       4        412  2016-03-10               E  awesome
9       4        413  2016-07-14               E  awesome

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    这是使用 groupbyapply 和自定义函数的解决方案:

    def categorize(g):
        if len(g) > 1 and g.iloc[0]['itemDescription'] == 'X':
            g['label'] = 'great'
        elif len(g) > 1 and g.iloc[0]['itemDescription'] != 'X':
            g['label'] = 'awesome'
        else:
            g['label'] = 'boo'
        return g
    
    df.groupby('custID').apply(categorize)  
    #    custID  transacID   orderDate itemDescription    label
    # 0       1        111  2016-01-10               A  awesome
    # 1       1        112  2016-02-02               B  awesome
    # 2       1        112  2016-02-02               C  awesome
    # 3       1        113  2016-04-10               X  awesome
    # 4       2        211  2016-02-02               X      boo
    # 5       3        311  2016-04-05               X      boo
    # 6       4        411  2016-02-05               X    great
    # 7       4        411  2016-02-05               C    great
    # 8       4        412  2016-03-10               E    great
    # 9       4        413  2016-07-14               E    great
    

    很可能有更多的解决方案来解决这个问题。

    【讨论】:

    • 这太棒了!!谢谢!
    猜你喜欢
    • 1970-01-01
    • 2023-01-19
    • 2018-01-23
    • 2017-03-17
    • 1970-01-01
    • 2021-08-23
    • 1970-01-01
    • 2016-08-09
    • 1970-01-01
    相关资源
    最近更新 更多