当前位置:

首页 > 编程开发 > Pandas创建条件列:识别新增零售商方法

Pandas创建条件列:识别新增零售商方法

本文介绍如何在Pandas中,针对用户在不同时间段的零售商使用数据,识别并标记出在后期出现的新增零售商。通过两种高效方法——利用merge函数的indicator参数和MultiIndex.isin方法——详细演示如何创建条件列,从而实现按用户分组的集合差异分析,为数据洞察提供支持。

本文目录

    利用Pandas创建条件列:识别用户新增零售商

    本文介绍如何在Pandas中,针对用户在不同时间段的零售商使用数据,识别并标记出在后期出现的新增零售商。通过两种高效方法——利用merge函数的indicator参数和MultiIndex.isin方法——详细演示如何创建条件列,从而实现按用户分组的集合差异分析,为数据洞察提供支持。

    问题背景与目标

    在用户行为分析中,我们经常需要比较不同时间段内用户行为的变化。一个常见的场景是,给定用户在前期(pre-period)和后期(post-period)访问的零售商列表,我们需要识别出在后期才首次出现的新增零售商。这里的关键在于,新增零售商的判断是基于每个用户独立进行的,即对于特定用户而言,某个零售商在后期出现但前期未曾出现,则被视为该用户的新增零售商。

    例如,我们有以下两组数据,分别代表用户在前期和后期访问的零售商记录:

    import pandas as pd
    
    # 前期数据 (sample1)
    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)
    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("前期数据 (sample1):")
    print(sample1)
    print("\n后期数据 (sample2):")
    print(sample2)

    我们的目标是在后期数据 sample2 中添加一个名为 is_new_retailer 的条件列,如果该行的 (user_id, retailer) 组合在 sample1 中不存在,则标记为1(表示新增),否则标记为0(表示非新增)。

    期望的输出结果示例如下:

        user_id    retailer  is_new_retailer
    0        45  retailer_1                0
    1        45  retailer_6                1  # user 45, retailer_6 在 sample1 中不存在
    ...
    14     2673  retailer_2                1  # user 2673, retailer_2 在 sample1 中不存在
    ...

    方法一:利用 merge 函数的 indicator 参数

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

    实现步骤

    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 的行,这表示这些 (user_id, retailer) 组合仅存在于 sample2 中,而不存在于 sample1 中。
    4. 将布尔值转换为整数(1表示新增,0表示非新增)。

    示例代码

    # 方法一:使用 merge 和 indicator 参数
    def find_new_retailers_with_merge(df_post, df_pre):
        """
        使用 Pandas merge 函数的 indicator 参数识别新增零售商。
    
        Args:
            df_post (pd.DataFrame): 后期数据,包含 user_id 和 retailer。
            df_pre (pd.DataFrame): 前期数据,包含 user_id 和 retailer。
    
        Returns:
            pd.DataFrame: 包含 'is_new_retailer' 列的后期数据。
        """
        # 执行左连接,并使用 indicator 参数
        # 连接键是 ['user_id', 'retailer'],确保是按用户-零售商组合进行匹配
        merged_df = df_post.merge(df_pre, on=['user_id', 'retailer'], how='left', indicator='_merge_indicator')
    
        # 根据 indicator 列判断是否为新增零售商
        # 'left_only' 表示该组合只存在于 df_post 中,而不在 df_pre 中
        merged_df['is_new_retailer'] = (merged_df['_merge_indicator'] == 'left_only').astype(int)
    
        # 移除临时的 indicator 列
        merged_df = merged_df.drop(columns=['_merge_indicator'])
    
        return merged_df
    
    result_merge = find_new_retailers_with_merge(sample2, sample1)
    print("\n方法一结果 (使用 merge indicator):")
    print(result_merge)

    注意事项

    • 此方法简洁高效,尤其适用于需要合并数据并同时识别差异的场景。
    • merge 操作会根据连接键的组合进行匹配。如果 sample1 和 sample2 中 (user_id, retailer) 组合存在重复,此方法依然能正确识别新增组合,但如果 df_post 中原始行存在重复,结果中也会保留这些重复。

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

    当需要对多列组合进行精确的集合成员判断时,创建 MultiIndex 并使用其 isin 方法是一个非常强大且通用的解决方案。

    实现步骤

    1. 从 sample2 和 sample1 中分别创建包含 user_id 和 retailer 两列的 MultiIndex。
    2. 使用 sample2 的 MultiIndex 调用 isin 方法,传入 sample1 的 MultiIndex 作为参数。这将返回一个布尔序列,指示 sample2 中的每个 (user_id, retailer) 组合是否在 sample1 中存在。
    3. 对布尔序列进行逻辑非(~)操作,因为我们寻找的是 不在 sample1 中的组合。
    4. 将布尔值转换为整数。

    示例代码

    # 方法二:使用 MultiIndex.isin
    def find_new_retailers_with_multiindex(df_post, df_pre):
        """
        使用 Pandas MultiIndex.isin 方法识别新增零售商。
    
        Args:
            df_post (pd.DataFrame): 后期数据,包含 user_id 和 retailer。
            df_pre (pd.DataFrame): 前期数据,包含 user_id 和 retailer。
    
        Returns:
            pd.DataFrame: 包含 'is_new_retailer' 列的后期数据。
        """
        # 从 df_post 和 df_pre 创建 MultiIndex
        # 这将把 'user_id' 和 'retailer' 组合成一个复合键
        multi_index_post = pd.MultiIndex.from_frame(df_post[['user_id', 'retailer']])
        multi_index_pre = pd.MultiIndex.from_frame(df_pre[['user_id', 'retailer']])
    
        # 检查 df_post 中的每个复合键是否在 df_pre 中
        # (~...) 表示如果不在 df_pre 中,则为 True (即新增)
        df_post['is_new_retailer'] = (~multi_index_post.isin(multi_index_pre)).astype(int)
    
        return df_post
    
    result_multiindex = find_new_retailers_with_multiindex(sample2.copy(), sample1) # 使用 .copy() 避免修改原始 sample2
    print("\n方法二结果 (使用 MultiIndex.isin):")
    print(result_multiindex)

    注意事项

    • MultiIndex.isin 方法在处理多列组合的集合成员判断时非常直观和高效。
    • 此方法直接在原始 DataFrame 上添加列,因此如果需要保留原始 DataFrame,请先进行复制(如示例中的 sample2.copy())。
    • 它不涉及合并操作,因此对于只需要进行集合判断而不需要合并其他列的场景,可能比 merge 更简洁。

    总结与比较

    两种方法都能有效地识别用户新增零售商,并在后期数据中创建相应的条件列。

    1. merge 与 indicator 参数:

      • 优点:代码简洁,易于理解,特别适合需要将两个数据集合并并同时标记差异的场景。
      • 缺点:会生成一个中间的 _merge_indicator 列,需要后续删除。如果只需要判断集合成员关系而不需要合并其他列,可能会显得稍微冗余。
    2. MultiIndex.isin 方法:

      • 优点:更直接地表达了多列组合的集合成员判断逻辑,适用于纯粹的集合操作。性能通常也很好。
      • 缺点:需要创建 MultiIndex 对象,对于不熟悉 MultiIndex 的用户来说可能稍显复杂。

    在实际应用中,选择哪种方法取决于具体的需求和个人偏好。如果你的任务是基于一个主表(后期数据)去检查其记录在另一个表(前期数据)中的存在性,并且主要关注的是“新增”标记,那么 MultiIndex.isin 提供了一种非常直接且高效的解决方案。如果你的分析还涉及从前期数据中引入其他列,或者你更习惯SQL风格的连接操作,那么 merge 配合 indicator 也是一个非常好的选择。两种方法都体现了Pandas在处理复杂数据关系方面的灵活性和强大功能。

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发
    相关文章 更多
    GitHub六个AI开源项目能做什么?软件理解、语音与求职场景
    GitHub六个AI开源项目能做什么?软件理解、语音与求职场景

    解析六个GitHub AI开源项目的具体用途,包括软件静态分析、智能体回答检查、多语言配音、求职材料生成、本地代码检索及动态歌词展示,帮助开发者根据实际需求筛选工具并正确验证结果。

    opencode安装skills教程及本地配置方法
    opencode安装skills教程及本地配置方法

    遇到OpenCode Skills无法加载或配置无效?本文手把手教你完成Skills的安装、环境变量设置及本地调试,避开常见坑点,让AI助手更懂你的代码习惯。

    如何开启Visual Studio2022实时代码分析警告提示
    如何开启Visual Studio2022实时代码分析警告提示

    解决 Visual Studio 2022 编辑时不显示代码分析警告的问题。指南涵盖 .NET 项目实时分析设置、Roslyn 分析器范围调整及错误列表来源筛选,确保开发者能高效利用实时代码诊断功能。

    如何在Visual Studio2022查看变量监视窗口调试程序
    如何在Visual Studio2022查看变量监视窗口调试程序

    详解 Visual Studio 2022 调试技巧:包括断点设置、监视窗口开启方法、变量添加步骤以及通过 F10 单步执行观察变量值变化的全过程。

    Visual Studio2017设置默认编码为UTF-8不带BOM
    Visual Studio2017设置默认编码为UTF-8不带BOM

    针对 Visual Studio 2017 缺乏全局默认编码选项的情况,详解如何利用 .editorconfig 设定项目级 UTF-8 无 BOM 规则,以及手动转换现有文件并校验字节的方法。

    Visual Studio2022F5调试提示启动项目未配置怎么修复
    Visual Studio2022F5调试提示启动项目未配置怎么修复

    解决 Visual Studio 2022 F5 调试报错问题,通过设置启动项目、检查解决方案属性及正确区分类库与应用项目,快速恢复调试功能。

    Visual Studio2022NuGet包还原失败离线处理方案
    Visual Studio2022NuGet包还原失败离线处理方案

    解决Visual Studio 2022离线环境中NuGet包还原失败的难题,涵盖依赖链分析、本地源配置、包集收集及隔离验证步骤,帮助开发者构建稳定的离线开发环境。

    Visual Studio2017大项目加载缓慢,优化加载性能技巧
    Visual Studio2017大项目加载缓慢,优化加载性能技巧

    解决Visual Studio 2017大型项目加载慢的实用指南。涵盖性能监测、扩展管理、文档恢复优化及版本兼容性检查,帮助开发者精准定位瓶颈并提升工作效率。

    Visual Studio2022设置多启动项目同时调试运行
    Visual Studio2022设置多启动项目同时调试运行

    详解 Visual Studio 2022 多启动项目配置方法,包括启动动作选择、顺序调整及调试技巧,帮助开发者高效调试分布式或前后端分离应用。

    fastapi下载文件接口实现教程
    fastapi下载文件接口实现教程

    深入解析在FastAPI框架中实现文件下载接口的完整方案,涵盖基于FileResponse的本地静态文件传输、基于StreamingResponse的分块流式传输、RFC 5987中文文件名编码规范、路径穿越安全防御及BackgroundTasks临时文件清理,并配备详细代码示例与架构解析图。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。