Pandas数据分析:识别用户新访问零售商的条件列创建方法(零售商.识别.创建.条件.方法...)

wufei123 发布于 2025-09-24 阅读(14)

Pandas数据分析:识别用户新访问零售商的条件列创建方法

本教程旨在解决如何在Pandas中识别用户在特定时间段内新访问的零售商。通过比较用户在前后两个时期使用的零售商数据,我们将利用pd.merge结合indicator参数或构建MultiIndex进行集合操作,为每个用户标记出其首次出现的新零售商,从而高效创建条件列,实现精细化用户行为分析。

在用户行为分析中,一个常见的需求是识别用户在某个观察期(例如“后时期”)内首次访问的实体(例如“零售商”),而这些实体在之前的时期(例如“前时期”)中并未被访问过。这需要我们针对每个用户,对比其在前、后两个时期内的行为记录,并生成一个指示性的条件列。

问题场景描述

假设我们拥有两张数据表,分别记录了用户在前时期和后时期访问的零售商信息。我们的目标是找出在后时期中,对于每个用户而言,哪些零售商是“新”的,即这些零售商在后时期被访问,但在前时期从未被该用户访问过。

以下是示例数据:

import pandas as pd

# 前时期用户访问零售商数据
sample1 = pd.DataFrame(
    {
        'user_id': [45, 556, 556, 556, 556, 556, 556, 1344, 1588, 2063, 2063, 2063, 2673, 2982, 2982],
        'retailer': ['retailer_1', 'retailer_1', 'retailer_2', 'retailer_3', 'retailer_4', 'retailer_5', 'retailer_6', 
                     'retailer_3', 'retailer_2', 'retailer_2', 'retailer_3', 'retailer_7', 'retailer_1', 'retailer_1', 'retailer_2']
    }
)

# 后时期用户访问零售商数据
sample2 = pd.DataFrame(
    {
        'user_id': [45, 45, 556, 556, 556, 556, 556, 556, 1344, 1588, 2063, 2063, 2063, 2673, 2673, 2982, 2982],
        'retailer': ['retailer_1', 'retailer_6', 'retailer_1', 'retailer_2', 'retailer_3', 'retailer_4', 'retailer_5', 'retailer_6', 
                     'retailer_3', 'retailer_2', 'retailer_2', 'retailer_3', 'retailer_7', 'retailer_1', 'retailer_2', 'retailer_1', 'retailer_2']
    }
)

我们的目标是为 sample2 添加一个名为 is_new_retailer 的列,如果某个 (user_id, retailer) 对在 sample2 中出现,但在 sample1 中未出现,则该列值为1,否则为0。

解决方案一:利用 pd.merge 的 indicator 参数

pd.merge 函数提供了一个 indicator 参数,当设置为 True 或指定一个列名时,它会在合并结果中添加一个特殊列,指示每行数据是来自左表、右表还是两者兼有。这对于识别“左表独有”的记录非常有用。

实现步骤
  1. 对 sample2 和 sample1 执行左合并(how='left')。合并键为 user_id 和 retailer。
  2. 设置 indicator='is_new_retailer',这将生成一个名为 is_new_retailer 的列,其值包括 'left_only'(仅在左表)、'right_only'(仅在右表,在左合并中不会出现)和 'both'(左右表均有)。
  3. 将 is_new_retailer 列中值为 'left_only' 的行转换为1,其他转换为0。
示例代码
# 使用merge与indicator参数
merged_df = sample2.merge(sample1, on=['user_id', 'retailer'], how='left', indicator='is_new_retailer_status')
merged_df['is_new_retailer'] = merged_df['is_new_retailer_status'].eq('left_only').astype(int)

# 移除辅助列,如果不需要
result_merge = merged_df.drop(columns=['is_new_retailer_status'])
print("--- 解决方案一:使用 merge 和 indicator ---")
print(result_merge)
结果分析

这种方法直观且高效。'left_only' 状态精确地标识了在 sample2 中存在但在 sample1 中不存在的 (user_id, retailer) 对,这正是我们定义“新零售商”的标准。需要注意的是,这种方法在合并键(这里是 user_id 和 retailer)在两个DataFrame中都没有重复值时表现完美。如果存在重复,merge 可能会产生笛卡尔积,但对于我们的场景,只要 (user_id, retailer) 对的唯一性是我们的关注点,它依然适用。

Teleporthq Teleporthq

一体化AI网站生成器,能够快速设计和部署静态网站

Teleporthq182 查看详情 Teleporthq 解决方案二:利用 MultiIndex 进行集合比较

当需要对多列组合进行集合操作(例如判断某个多列组合是否存在于另一个多列组合的集合中)时,使用 MultiIndex 是一种非常强大且通用的方法。

实现步骤
  1. 从 sample2 和 sample1 中分别创建 MultiIndex,包含 user_id 和 retailer 列。每个 MultiIndex 代表了对应DataFrame中 (user_id, retailer) 对的唯一集合。
  2. 使用 Index.isin() 方法检查 sample2 的 MultiIndex 中的每个元素是否存在于 sample1 的 MultiIndex 中。这将返回一个布尔型Series。
  3. 对布尔型Series取反(~),因为我们寻找的是“不在前时期零售商集合中”的零售商。
  4. 将结果转换为整数类型(astype(int)),1表示新零售商,0表示非新零售商。
示例代码
# 使用MultiIndex进行集合比较
# 为sample2和sample1创建MultiIndex
mux_sample2 = pd.MultiIndex.from_frame(sample2[['user_id', 'retailer']])
mux_sample1 = pd.MultiIndex.from_frame(sample1[['user_id', 'retailer']])

# 检查sample2中的(user_id, retailer)对是否不在sample1中
sample2['is_new_retailer'] = (~mux_sample2.isin(mux_sample1)).astype(int)

print("\n--- 解决方案二:使用 MultiIndex 进行集合比较 ---")
print(sample2)
结果分析

MultiIndex 方法提供了一个更具通用性的解决方案,它将 (user_id, retailer) 视为一个复合键,然后执行集合成员资格检查。Index.isin() 专门用于检查一个索引中的元素是否存在于另一个索引中。这种方法在概念上更接近于集合的“差集”操作,即找出 sample2 中有而 sample1 中没有的元素。它对原始DataFrame中的重复行处理得很好,因为 MultiIndex 本身就代表了唯一的组合。

总结与注意事项
  • 选择合适的方案:
    • pd.merge 结合 indicator 参数:如果你的问题可以清晰地建模为两个表的合并,并且你主要关注左表独有的记录,这种方法简洁直观。它在内部处理了匹配逻辑,并且对于许多SQL背景的用户来说更容易理解。
    • MultiIndex 结合 isin():当你的核心问题是判断多列组合的“集合成员资格”时,这种方法更加强大和灵活。它避免了合并可能带来的额外列,直接生成布尔结果,对于复杂的集合操作更为通用。
  • 性能考虑: 对于大型数据集,两种方法在Pandas内部都经过优化,通常都能提供良好的性能。具体哪种更快可能取决于数据分布和Pandas版本,但在大多数常见场景下,性能差异不显著。
  • 数据预处理: 确保 user_id 和 retailer 列的数据类型在两个DataFrame中一致,以避免合并或索引创建时的潜在问题。
  • 定义“新”: 在实际应用中,务必清晰定义“新”的含义。本教程中,“新”指的是一个 (user_id, retailer) 对在后时期出现,但在前时期从未出现。如果“新”的定义更复杂(例如,考虑时间戳或用户活动状态),则可能需要更复杂的逻辑。

通过上述两种方法,我们可以高效地在Pandas中识别并标记出用户在新时期内访问的新零售商,为进一步的用户行为分析(如新用户增长、零售商推荐系统等)奠定基础。

以上就是Pandas数据分析:识别用户新访问零售商的条件列创建方法的详细内容,更多请关注知识资源分享宝库其它相关文章!

相关标签: ai sql pandas 数据类型 布尔型 int 整数类型 数据分析 大家都在看: 有没有想过像您一样的AI“看到”?初学者&#s注意指南 AI模型的兴起,能够在各个行业创建内容,设计和解决方案 将您的数据模型转换为AI工作流 - 只有XTRA线的代码! 掌握对话AI的艺术:与Python的见解和实施 与Python掌握对话AI的艺术:逐步指南

标签:  零售商 识别 创建 

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。