0

0

利用Pandas在窗口内创建条件列以识别新增零售商

DDD

DDD

发布时间:2025-09-24 12:01:22

|

651人浏览过

|

来源于php中文网

原创

利用Pandas在窗口内创建条件列以识别新增零售商

本文详细介绍了如何使用Pandas在用户维度上,对比两个时期的数据集,高效识别用户新增的零售商。我们将探讨两种主要方法:利用pd.merge的indicator参数进行合并识别,以及通过构建MultiIndex并运用Index.isin进行集合成员判断。这两种方法都能帮助数据分析师准确地标记出用户在后期新增的零售商,适用于处理类似的用户行为分析场景。

问题背景与数据准备

在用户行为分析中,我们经常需要识别用户在不同时间段内行为模式的变化。一个常见的场景是,给定用户在前期(pre-period)和后期(post-period)使用的零售商数据,我们需要找出在后期新增的零售商,即那些在后期使用但前期从未使用的零售商。这需要在每个用户(user_id)的“窗口”内进行比较。

为了演示这一过程,我们准备了两份模拟数据:sample1代表用户在前期使用的零售商,sample2代表用户在后期使用的零售商。

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']
    }
)

print("Sample 1 (前期数据):")
print(sample1)
print("\nSample 2 (后期数据):")
print(sample2)

我们的目标是在sample2中添加一个名为is_new_retailer的条件列,如果某个user_id与retailer的组合在sample2中存在,但在sample1中不存在,则该列值为1,否则为0。

方法一:利用 pd.merge 的 indicator 参数

Pandas的merge函数提供了一个indicator参数,可以在合并结果中添加一个特殊列,指示每行数据是来源于左表、右表还是两者的交集。这对于识别数据集间的差异非常有用。

步骤详解

  1. 执行左合并(Left Join):我们将sample2作为左表,sample1作为右表,基于user_id和retailer列进行左合并。how='left'确保sample2中的所有行都会被保留。
  2. 使用 indicator 参数:设置indicator='is_new_retailer',Pandas会在合并结果中创建一个名为is_new_retailer的列。这个列的值会是'left_only'(仅存在于左表)、'right_only'(仅存在于右表)或'both'(两表都存在)。
  3. 转换指示列为数值:我们关注的是在sample2中存在但在sample1中不存在的组合,这对应于indicator列的值为'left_only'。通过.eq('left_only')可以得到一个布尔Series,再通过.astype(int)将其转换为0或1的整数。

示例代码

# 方法一:使用 merge 的 indicator 参数
merged_df = sample2.merge(sample1, on=['user_id', 'retailer'], how='left', indicator='_merge_indicator')

# 'left_only' 表示该行(user_id, retailer)组合只存在于 sample2 中
merged_df['is_new_retailer'] = (merged_df['_merge_indicator'] == 'left_only').astype(int)

# 移除辅助的 _merge_indicator 列,只保留需要的列
result_merge = merged_df[['user_id', 'retailer', 'is_new_retailer']]
print("\n方法一结果 (使用 merge indicator):")
print(result_merge)

注意事项

  • 这种方法简洁直观,尤其适用于识别两个数据集之间的差异。
  • 如果sample1或sample2中存在user_id和retailer的重复组合,merge操作会根据合并键处理这些重复项。在本例中,由于我们关心的是(user_id, retailer)的组合是否出现,即使单个用户多次使用同一零售商,只要该组合在前期存在过,就不会被标记为“新”。
  • indicator参数在Pandas 0.17.0版本后可用。

方法二:利用 MultiIndex.isin 进行多列集合判断

MultiIndex允许我们将多个列组合成一个复合索引,然后可以利用索引的isin方法高效地检查一个复合键是否存在于另一个复合键集合中。这是一种更通用的集合成员判断方法。

神采PromeAI
神采PromeAI

将涂鸦和照片转化为插画,将线稿转化为完整的上色稿。

下载

步骤详解

  1. 创建 MultiIndex:分别从sample1和sample2中提取user_id和retailer列,并使用pd.MultiIndex.from_frame()创建两个MultiIndex对象。一个代表前期组合的集合(mux1),另一个代表后期组合的集合(mux2)。
  2. 使用 Index.isin 判断成员关系:mux2.isin(mux1)会返回一个布尔Series,指示sample2中的每个(user_id, retailer)组合是否在sample1中出现过。
  3. 取反并转换为数值:由于我们要识别的是“新增”零售商(即在sample2中存在但不在sample1中),我们需要对isin的结果取反(~操作符),然后将其转换为整数类型(astype(int))。

示例代码

# 方法二:使用 MultiIndex.isin
# 创建 sample2 的 MultiIndex
mux2 = pd.MultiIndex.from_frame(sample2[['user_id', 'retailer']])
# 创建 sample1 的 MultiIndex
mux1 = pd.MultiIndex.from_frame(sample1[['user_id', 'retailer']])

# 判断 sample2 中的组合是否在 sample1 中出现过
# ~ 表示取反,即不在 sample1 中的组合
sample2['is_new_retailer'] = (~mux2.isin(mux1)).astype(int)

result_multiindex = sample2
print("\n方法二结果 (使用 MultiIndex.isin):")
print(result_multiindex)

注意事项

  • 这种方法在概念上更接近于集合操作,直接比较复合键的成员关系。
  • MultiIndex.isin通常在处理大量数据时表现出良好的性能,因为它利用了Pandas底层的优化。
  • 它直接在原始DataFrame上添加列,不需要额外的合并步骤,对于某些场景可能更简洁。

两种方法的比较与选择

两种方法都能有效解决在用户维度上识别新增零售商的问题,并且在本例中产生了相同的结果。

  • pd.merge 与 indicator
    • 优点:直观易懂,特别是对于熟悉SQL合并操作的用户。合并结果可以同时包含来自两个表的信息。
    • 缺点:如果只需要判断成员关系,合并操作可能会产生额外的列,需要后续清理。对于非常大的数据集,合并本身的开销可能略高。
  • MultiIndex.isin
    • 优点:更直接地进行多列的集合成员判断,代码简洁。在处理大规模数据时,通常性能表现优异。
    • 缺点:对于不熟悉MultiIndex概念的用户,理解上可能需要一点时间。

在实际应用中,如果你的主要目标是识别特定组合的成员关系,并且数据量较大,MultiIndex.isin通常是一个高效且优雅的选择。如果你的任务还涉及到从两个表中获取更多相关信息,那么pd.merge会是更合适的工具

总结

通过本文,我们学习了两种在Pandas中高效识别用户新增零售商的方法。无论是利用pd.merge的indicator参数进行合并识别,还是通过构建MultiIndex并运用Index.isin进行集合成员判断,都能帮助数据分析师准确地标记出用户在后期新增的零售商。选择哪种方法取决于具体的应用场景、数据规模以及个人偏好。掌握这些技术将有助于你在数据分析工作中更灵活地处理复杂的条件列创建任务。

相关专题

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

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

676

2023.10.12

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

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

320

2023.10.27

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

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

346

2024.02.23

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

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

1094

2024.03.06

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

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

357

2024.03.06

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

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

675

2024.04.07

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

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

571

2024.04.29

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

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

414

2024.04.29

Java 项目构建与依赖管理(Maven / Gradle)
Java 项目构建与依赖管理(Maven / Gradle)

本专题系统讲解 Java 项目构建与依赖管理的完整体系,重点覆盖 Maven 与 Gradle 的核心概念、项目生命周期、依赖冲突解决、多模块项目管理、构建加速与版本发布规范。通过真实项目结构示例,帮助学习者掌握 从零搭建、维护到发布 Java 工程的标准化流程,提升在实际团队开发中的工程能力与协作效率。

10

2026.01.12

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 3.5万人学习

Pandas 教程
Pandas 教程

共15课时 | 0.9万人学习

ASP 教程
ASP 教程

共34课时 | 3.5万人学习

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

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