【发布时间】:2022-01-05 10:09:27
【问题描述】:
我有一个附有样本的数据框。我想为我的数据框中的所有用户提供忠诚度标签。
标签及其条件为:
-
first_time_visitor- session = 0 的任何用户(参见忠诚度列的第一行) -
frequent_visitor- session > 0 且 count_session_products > 0 的任何用户 -
first_time_customer- 首次结账:确认出现在类型栏 -
repeat_customer- 第二次结账:确认出现在类型栏 -
loyal_customer- 第三次结帐:确认出现在类型栏
我在计算 first_time_customer、repeat_customer 和 loyal_customer 标签时遇到问题。
我只有几个想法,一个是使用first_valid_index() 或argmax() 来查找索引,并以某种方式在某个条件下使用它来创建first_time_customer 标签。
(df_customer_1.type.values == 'checkout:confirmation').argmax()
df_customer_1[df_customer_1.type == 'checkout:confirmation'].first_valid_index()
但我不确定如何实现这些条件。
最后我希望图片中的忠诚度栏看起来像:
first_time_visitor
frequent_visitor
first_time_customer
repeat_customer
frequent_visitor
loyal_customer
谁能指导我如何实现这一目标?到目前为止,我没有任何代码可以显示,因此您可能必须想出一些东西。我们可以尝试 pandas 或典型的 Python 方式。
这是我目前所拥有的,数据样本:
data = {
'user_id': [
'9EPWZVMNP6D6KWX', '9EPWZVMNP6D6KWX', '9EPWZVMNP6D6KWX',
'9EPWZVMNP6D6KWX', '9EPWZVMNP6D6KWX', '9EPWZVMNP6D6KWX'
],
'timestamp': [
1612139269, 1612139665, 1612139579,
1612141096, 1612143046, 1612143729
],
'type': ['productDetails', 'productDetails', 'checkout:confirmation', 'checkout:confirmation', 'productList', 'checkout:confirmation'],
'session': [0,1,2,3,4,5],
'count_session_products': [4, 1, 0, 4, 2, 2],
'loyalty' : [0,0,0,0,0,0]}
test_df = pd.DataFrame(data)
test_df
这给了我:
| user_id | timestamp | type | session | prods | loyalty |
|---|---|---|---|---|---|
| 9EPWZVMNP6D6KWX | 1612139269 | productDetails | 0 | 4 | 0 |
| 9EPWZVMNP6D6KWX | 1612139665 | productDetails | 1 | 1 | 0 |
| 9EPWZVMNP6D6KWX | 1612139579 | checkout:confirmation | 2 | 0 | 0 |
| 9EPWZVMNP6D6KWX | 1612141096 | checkout:confirmation | 3 | 4 | 0 |
| 9EPWZVMNP6D6KWX | 1612143046 | productList | 4 | 2 | 0 |
| 9EPWZVMNP6D6KWX | 1612143729 | checkout:confirmation | 5 | 2 | 0 |
frequent_visiotr 和 first_time_visitor 的第一个条件:
test_df['loyalty'] = np.where((test_df['session'] > 0) & ((test_df['type'] != 'checkout:confirmation')), 'frequent_visitor', None)
test_df.loc[test_df['session'] == 0, 'loyalty'] = 'first_time_visitor'
这给了我:
| user_id | timestamp | type | session | prods | loyalty |
|---|---|---|---|---|---|
| 9EPWZVMNP6D6KWX | 1612139269 | productDetails | 0 | 4 | first_time_visitor |
| 9EPWZVMNP6D6KWX | 1612139665 | productDetails | 1 | 1 | frequent_visitor |
| 9EPWZVMNP6D6KWX | 1612139579 | checkout:confirmation | 2 | 0 | 0 |
| 9EPWZVMNP6D6KWX | 1612141096 | checkout:confirmation | 3 | 4 | 0 |
| 9EPWZVMNP6D6KWX | 1612143046 | productList | 4 | 2 | frequent_visitor |
| 9EPWZVMNP6D6KWX | 1612143729 | checkout:confirmation | 5 | 2 | 0 |
现在这是我卡住的地方,我需要 first_time_customer、repeat_customer 和loyal_customer 的条件。上面描述了这些条件的规则。我希望最终数据框看起来像这样:
| user_id | timestamp | type | session | prods | loyalty |
|---|---|---|---|---|---|
| 9EPWZVMNP6D6KWX | 1612139269 | productDetails | 0 | 4 | first_time_visitor |
| 9EPWZVMNP6D6KWX | 1612139665 | productDetails | 1 | 1 | frequent_visitor |
| 9EPWZVMNP6D6KWX | 1612139579 | checkout:confirmation | 2 | 0 | first_time_customer |
| 9EPWZVMNP6D6KWX | 1612141096 | checkout:confirmation | 3 | 4 | repeat_customer |
| 9EPWZVMNP6D6KWX | 1612143046 | productList | 4 | 2 | frequent_visitor |
| 9EPWZVMNP6D6KWX | 1612143729 | checkout:confirmation | 5 | 2 | loyal_customer |
【问题讨论】:
-
Pandas 让这种事情变得非常简单。如果你尝试一下 Pandas 并描述你卡在哪里,你的问题会写得更好。我建议您使用搜索词“pandas add column based on condition”搜索一些问题。例如,这是一个很好的问题,它提供了一个很好的例子来说明从哪里开始:stackoverflow.com/questions/27041724/…
-
嘿大卫,谢谢你的建议。你现在可以看看这个问题吗?希望它现在可以帮助您更好地理解问题:)
-
这是一个写得很好的问题,更具体,包括代码和简化的示例。我会为每个条件添加一个单独的列(如果您愿意,您可以添加一个组合所有条件的最后一列,但只有在您为每个特定条件都有一个列之后)。例如,第一次客户列将是简单的
is_new_customer = df['session'] == 0,它返回一个pd.Series对象,然后您可以使用df['is_new_cusotmer'] = is_new_customer将其添加到数据框中。现在您有一列 True|False 值来识别新客户。 -
这个问题还包括向数据框添加列:stackoverflow.com/questions/12555323/…
-
这是另一个有用的参考问题:stackoverflow.com/questions/21702342/…
标签: python pandas dataframe conditional-statements