当前位置:首页 > 文章列表 > 文章 > python教程 > Pandas窗口条件识别新增零售商

Pandas窗口条件识别新增零售商

2025-10-18 08:06:34 0浏览 收藏

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

利用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方法高效地检查一个复合键是否存在于另一个复合键集合中。这是一种更通用的集合成员判断方法。

步骤详解

  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进行集合成员判断,都能帮助数据分析师准确地标记出用户在后期新增的零售商。选择哪种方法取决于具体的应用场景、数据规模以及个人偏好。掌握这些技术将有助于你在数据分析工作中更灵活地处理复杂的条件列创建任务。

今天关于《Pandas窗口条件识别新增零售商》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

Windows11远程协助设置教程Windows11远程协助设置教程
上一篇
Windows11远程协助设置教程
Java自定义异常抛出方法全解析
下一篇
Java自定义异常抛出方法全解析
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • ChatExcel酷表:告别Excel难题,北大团队AI助手助您轻松处理数据
    ChatExcel酷表
    ChatExcel酷表是由北京大学团队打造的Excel聊天机器人,用自然语言操控表格,简化数据处理,告别繁琐操作,提升工作效率!适用于学生、上班族及政府人员。
    3181次使用
  • Any绘本:开源免费AI绘本创作工具深度解析
    Any绘本
    探索Any绘本(anypicturebook.com/zh),一款开源免费的AI绘本创作工具,基于Google Gemini与Flux AI模型,让您轻松创作个性化绘本。适用于家庭、教育、创作等多种场景,零门槛,高自由度,技术透明,本地可控。
    3391次使用
  • 可赞AI:AI驱动办公可视化智能工具,一键高效生成文档图表脑图
    可赞AI
    可赞AI,AI驱动的办公可视化智能工具,助您轻松实现文本与可视化元素高效转化。无论是智能文档生成、多格式文本解析,还是一键生成专业图表、脑图、知识卡片,可赞AI都能让信息处理更清晰高效。覆盖数据汇报、会议纪要、内容营销等全场景,大幅提升办公效率,降低专业门槛,是您提升工作效率的得力助手。
    3423次使用
  • 星月写作:AI网文创作神器,助力爆款小说速成
    星月写作
    星月写作是国内首款聚焦中文网络小说创作的AI辅助工具,解决网文作者从构思到变现的全流程痛点。AI扫榜、专属模板、全链路适配,助力新人快速上手,资深作者效率倍增。
    4527次使用
  • MagicLight.ai:叙事驱动AI动画视频创作平台 | 高效生成专业级故事动画
    MagicLight
    MagicLight.ai是全球首款叙事驱动型AI动画视频创作平台,专注于解决从故事想法到完整动画的全流程痛点。它通过自研AI模型,保障角色、风格、场景高度一致性,让零动画经验者也能高效产出专业级叙事内容。广泛适用于独立创作者、动画工作室、教育机构及企业营销,助您轻松实现创意落地与商业化。
    3801次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码