【问题标题】:Creating Loyalty labels for a user using conditions on a dataframe使用数据框上的条件为用户创建忠诚度标签
【发布时间】: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_customerrepeat_customerloyal_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


【解决方案1】:

这主要是一个映射练习,所以我会做几个让你做剩下的事情。

def determine_loyalty(data: Series) -> str:
  if data["session"] == 0:
    return "first_time_visitor"
  elif data["session"] > 0 and data["count_session_products"] > 0:
    return "frequent_visitor"


df = DataFrame([{session:0,count_session_products:0},{session:2,count_session_products:6}]) # your dataframe
df["loyalty"] = df.apply(lambda x: determine_loyalty(x))

这会给你:

print(df)
   session  count_session_products             loyalty
0        0                       0  first_time_visitor
1        2                       6    frequent_visitor

现在,如果您只想要新客户,您可以这样做:

first_time_customers: DataFrame = df[df["loyalty"] == "first_time_visitor"]

字符串过滤肯定比 int/bool 比较慢,所以我强烈建议您提供应用程序知道模型含义的数据帧级别。例如:

class LoyaltyLevels(Enum):
    FIRST_TIME_VISITOR=1
    FREQUENT_VISITOR=2



# change determine_loyalty to give integer values instead
def determine_loyalty(data: Series) -> str:
  if data["session"] == 0:
    return LoyaltyLevels.FIRST_TIME_VISITOR.value
  elif data["session"] > 0 and data["count_session_products"] > 0:
    return LoyaltyLevels.FREQUENT_VISITOR.value


# now we can filter using the integer value

first_time = df[df["loyalty"] == LoyaltyLevels.FIRST_TIME_VISITOR.value]

【讨论】:

  • 我理解这一点,并且已经创建了 first_time_visitor 和frequent_visitor 的条件,但问题是如何为 first_time_customer 标签应用过滤器?它的条件是什么?
  • @Salaaned 在上面回答
猜你喜欢
  • 2020-04-12
  • 2018-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-12
  • 1970-01-01
  • 2022-07-11
  • 2018-12-06
相关资源
最近更新 更多