0

0

使用 Pandas 高效识别用户新零售商:条件列创建教程

霞舞

霞舞

发布时间:2025-09-24 12:08:32

|

461人浏览过

|

来源于php中文网

原创

使用 Pandas 高效识别用户新零售商:条件列创建教程

本文旨在指导读者如何使用 Pandas 在用户行为数据中识别特定时期内出现的新零售商。我们将探讨两种高效的方法:利用 pd.merge 的 indicator 参数进行合并分析,以及通过创建 MultiIndex 并结合 isin 方法进行多列条件判断,最终为每个零售商记录生成一个“是否为新零售商”的条件列。

引言

在数据分析场景中,我们经常需要比较两个数据集,以识别在第二个数据集中出现但在第一个数据集中不存在的实体。例如,在用户行为分析中,我们可能需要找出用户在“后观察期”访问的哪些零售商是“前观察期”从未访问过的。这要求我们针对每个用户,比较其在两个时期内的零售商集合,并标记出新增的零售商。传统的 isin() 或 loc[] 方法在处理多列(如 user_id 和 retailer 组合)的条件判断时可能不够直观或高效。本教程将介绍两种使用 pandas 解决此类问题的专业方法。

数据准备

首先,我们创建两个示例 DataFrame,分别代表用户在“前观察期”和“后观察期”的零售商访问记录。

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 的列,如果 sample2 中的某个 (user_id, retailer) 组合在 sample1 中不存在,则该列值为 1,否则为 0。

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

Pandas 的 merge 函数提供了一个 indicator 参数,当设置为 True 或一个字符串时,它会生成一个额外的列,指示每行记录的来源。这对于识别仅存在于左 DataFrame、仅存在于右 DataFrame 或同时存在于两者的数据非常有用。

  1. 执行左合并: 我们将 sample2 作为左 DataFrame,sample1 作为右 DataFrame,基于 user_id 和 retailer 列进行左合并。indicator='is_new_retailer' 会创建一个新列来标记合并结果。
  2. 解释 indicator 结果: indicator 列将包含 'left_only' (仅存在于 sample2)、'right_only' (仅存在于 sample1,但在左合并中不会出现) 或 'both' (同时存在于两者)。
  3. 转换为二进制标志: 我们关注的是 'left_only' 的情况,这意味着该 (user_id, retailer) 组合在 sample2 中有,但在 sample1 中没有,即它是一个新零售商。我们将 'left_only' 转换为 1,其他情况转换为 0。
# 使用 left merge 和 indicator 参数
# 将 sample2 作为左表,sample1 作为右表
# indicator='is_new_retailer' 会生成一个名为 'is_new_retailer' 的列,
# 标记每行记录的来源 ('left_only', 'right_only', 'both')
merged_df = sample2.merge(sample1, on=['user_id', 'retailer'], how='left', indicator='is_new_retailer')

# 将 'is_new_retailer' 列的 'left_only' 值转换为 1 (表示新零售商),其他转换为 0
# 'left_only' 意味着该组合只存在于 sample2 中,而不存在于 sample1 中
merged_df['is_new_retailer'] = merged_df['is_new_retailer'].eq('left_only').astype(int)

print("\n方法一:使用 pd.merge 的 indicator 参数")
print(merged_df)

注意事项: 这种方法在 (user_id, retailer) 组合在两个 DataFrame 中都是唯一的情况下表现完美。如果存在重复,merge 操作可能会产生额外的行,但这通常不是问题,因为我们通常关心的是组合的唯一性,而不是行的计数。

方法二:利用 MultiIndex.isin 进行多列条件判断

当需要基于多列的组合来检查成员关系时,创建 MultiIndex 是一个非常灵活且强大的方法。这种方法的核心思想是将多个列组合成一个复合索引,然后使用 Index.isin() 方法来检查一个复合索引中的元素是否存在于另一个复合索引中。

Manus
Manus

全球首款通用型AI Agent,可以将你的想法转化为行动。

下载
  1. 创建 MultiIndex: 分别从 sample1 和 sample2 中选择 user_id 和 retailer 列,创建两个 MultiIndex 对象。
  2. 使用 isin() 检查成员关系: 使用 sample2 的 MultiIndex 调用 isin() 方法,并传入 sample1 的 MultiIndex。这将返回一个布尔 Series,指示 sample2 中每个 (user_id, retailer) 组合是否在 sample1 中存在。
  3. 转换为二进制标志: 将布尔 Series 取反 (~),然后转换为整数类型 (astype(int)),其中 True (不在 sample1 中) 变为 1,False (在 sample1 中) 变为 0。
# 创建 sample2 的 MultiIndex,包含 user_id 和 retailer
mux1 = pd.MultiIndex.from_frame(sample2[['user_id', 'retailer']])
# 创建 sample1 的 MultiIndex,包含 user_id 和 retailer
mux2 = pd.MultiIndex.from_frame(sample1[['user_id', 'retailer']])

# 检查 mux1 中的每个组合是否在 mux2 中存在
# (~mux1.isin(mux2)) 表示:如果 mux1 中的组合不在 mux2 中,则为 True (即为新零售商)
sample2['is_new_retailer'] = (~mux1.isin(mux2)).astype(int)

print("\n方法二:利用 MultiIndex.isin 进行多列条件判断")
print(sample2)

优点: 这种方法在概念上更直接地表达了“检查一个多列组合是否存在于另一个多列组合集合中”的需求。它避免了 merge 操作可能带来的行数变化,直接在原始 DataFrame 上添加新列,尤其适用于需要精确控制行匹配的场景。

总结与注意事项

我们探讨了两种在 Pandas 中创建条件列以识别“新”实体的高效方法:

  1. pd.merge 结合 indicator 参数: 适用于通过合并操作来识别左右 DataFrame独有或共有的记录。其优点是直观且代码简洁,尤其适合在合并过程中直接生成标志。
  2. MultiIndex.isin 方法: 适用于需要基于多列组合进行成员关系检查的场景。它提供了更精细的控制,直接在原始 DataFrame 上进行判断,避免了合并可能带来的额外行。

在选择方法时,请考虑以下几点:

  • 数据量: 对于非常大的数据集,两种方法的性能可能有所不同。merge 通常在 C 语言层面实现,可能在某些情况下更快,但 MultiIndex 的查找效率也很高。建议在实际应用中对大规模数据进行性能测试
  • 重复值处理: 两种方法都能正确处理 (user_id, retailer) 组合的唯一性。merge 方法在 on 列存在重复时会产生笛卡尔积,但 indicator 列的标记依然准确;MultiIndex.isin 则直接基于组合的唯一性进行判断。
  • 可读性与意图: MultiIndex.isin 更直接地表达了“检查多列组合的成员关系”这一意图,对于理解代码逻辑可能更为清晰。

通过这两种方法,您可以灵活高效地在 Pandas 中处理复杂的条件判断,为您的数据分析任务提供强大的支持。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

65

2025.12.04

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

299

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

212

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1502

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

624

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

633

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

589

2024.04.29

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

172

2025.07.29

java入门学习合集
java入门学习合集

本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。

1

2026.01.29

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
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号