Pandas窗口条件识别新增零售商
时间:2025-10-18 08:06:34 421浏览 收藏
你在学习文章相关的知识吗?本文《Pandas窗口条件列识别新增零售商》,主要介绍的内容就涉及到,如果你想提升自己的开发能力,就不要错过这篇文章,大家要知道编程理论基础和实战操作都是不可或缺的哦!

问题背景与数据准备
在用户行为分析中,我们经常需要识别用户在不同时间段内行为模式的变化。一个常见的场景是,给定用户在前期(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参数,可以在合并结果中添加一个特殊列,指示每行数据是来源于左表、右表还是两者的交集。这对于识别数据集间的差异非常有用。
步骤详解
- 执行左合并(Left Join):我们将sample2作为左表,sample1作为右表,基于user_id和retailer列进行左合并。how='left'确保sample2中的所有行都会被保留。
- 使用 indicator 参数:设置indicator='is_new_retailer',Pandas会在合并结果中创建一个名为is_new_retailer的列。这个列的值会是'left_only'(仅存在于左表)、'right_only'(仅存在于右表)或'both'(两表都存在)。
- 转换指示列为数值:我们关注的是在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方法高效地检查一个复合键是否存在于另一个复合键集合中。这是一种更通用的集合成员判断方法。
步骤详解
- 创建 MultiIndex:分别从sample1和sample2中提取user_id和retailer列,并使用pd.MultiIndex.from_frame()创建两个MultiIndex对象。一个代表前期组合的集合(mux1),另一个代表后期组合的集合(mux2)。
- 使用 Index.isin 判断成员关系:mux2.isin(mux1)会返回一个布尔Series,指示sample2中的每个(user_id, retailer)组合是否在sample1中出现过。
- 取反并转换为数值:由于我们要识别的是“新增”零售商(即在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进行集合成员判断,都能帮助数据分析师准确地标记出用户在后期新增的零售商。选择哪种方法取决于具体的应用场景、数据规模以及个人偏好。掌握这些技术将有助于你在数据分析工作中更灵活地处理复杂的条件列创建任务。
今天关于《Pandas窗口条件识别新增零售商》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
296 收藏
-
351 收藏
-
157 收藏
-
485 收藏
-
283 收藏
-
349 收藏
-
291 收藏
-
204 收藏
-
401 收藏
-
227 收藏
-
400 收藏
-
327 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习