我正在为已购买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
答案 0 :(得分:4)
以下是使用groupby
和apply
自定义函数的解决方案:
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
可能有更多可以解决的问题。