0

0

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

聖光之護

聖光之護

发布时间:2025-09-24 13:02:22

|

624人浏览过

|

来源于php中文网

原创

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

Kive
Kive

一站式AI图像生成和管理平台

下载

解决方案二:利用 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中识别并标记出用户在新时期内访问的新零售商,为进一步的用户行为分析(如新用户增长、零售商推荐系统等)奠定基础。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

684

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

323

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

348

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1097

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

359

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

697

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

577

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

419

2024.04.29

Golang 性能分析与pprof调优实战
Golang 性能分析与pprof调优实战

本专题系统讲解 Golang 应用的性能分析与调优方法,重点覆盖 pprof 的使用方式,包括 CPU、内存、阻塞与 goroutine 分析,火焰图解读,常见性能瓶颈定位思路,以及在真实项目中进行针对性优化的实践技巧。通过案例讲解,帮助开发者掌握 用数据驱动的方式持续提升 Go 程序性能与稳定性。

9

2026.01.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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