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

聖光之護
发布: 2025-09-24 13:02:22
原创
610人浏览过

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) 对的唯一性是我们的关注点,它依然适用。

知我AI·PC客户端
知我AI·PC客户端

离线运行 AI 大模型,构建你的私有个人知识库,对话式提取文件知识,保证个人文件数据安全

知我AI·PC客户端 0
查看详情 知我AI·PC客户端

解决方案二:利用 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数据分析:识别用户新访问零售商的条件列创建方法的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
热门推荐
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号