从交易数据框(熊猫)标记客户

时间:2018-04-25 19:47:47

标签: python pandas

我正在为已购买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

1 个答案:

答案 0 :(得分:4)

以下是使用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

可能有更多可以解决的问题。