0

0

Pandas DataFrame 高效比较与条件列赋值教程

DDD

DDD

发布时间:2025-09-29 12:25:38

|

549人浏览过

|

来源于php中文网

原创

pandas dataframe 高效比较与条件列赋值教程

本教程详细介绍了如何使用 Pandas 和 NumPy 高效地比较两个 DataFrame,并根据第一个 DataFrame 中的行是否存在于第二个 DataFrame 中,为新列赋值。通过 isin()、all(axis=1) 和 np.where() 的组合,可以实现灵活的条件逻辑,自动标记匹配或不匹配的数据行,这对于数据清洗、合并或状态追踪等场景非常实用。

1. 场景概述

在数据处理过程中,我们经常需要对比两个数据集,并根据对比结果更新其中一个数据集。一个典型的场景是:给定两个 Pandas DataFrame,data1 和 data2,我们希望检查 data1 中的每一行是否“存在”于 data2 中。如果存在,则在 data1 中新增一个列,并为该行赋值 "Open";如果不存在,则赋值 "New"。

例如,考虑以下两个 DataFrame:

import pandas as pd
import numpy as np

data1 = pd.DataFrame(
    {'A': [1, 2, 3, 4, 5],
     'B': ['apple', 'banana', 'orange', 'apple', 'grape'],
     'C': [10, 20, 30, 40, 50]})

data2 = pd.DataFrame(
    {'A': [1, 2, 6],
     'B': ['apple', 'banana', 'kiwi'],
     'C': [10, 20, 60]})

print("DataFrame 1:")
print(data1)
print("\nDataFrame 2:")
print(data2)

期望的结果是 data1 中新增 new_col 列,其中 (A=1, B='apple', C=10) 和 (A=2, B='banana', C=20) 对应的行为 "Open",其余为 "New"。

2. 核心概念与方法

要实现上述功能,我们将利用 Pandas 和 NumPy 中的几个关键函数:

  • pandas.DataFrame.isin(): 这个方法用于检查 DataFrame 中的每个元素是否包含在另一个 Series、DataFrame 或列表的对应位置(或所有位置,取决于参数)。当 isin() 的参数是一个 DataFrame 时,它会逐列检查 self DataFrame 中的每个元素是否在参数 DataFrame 的对应列中存在。返回一个布尔型的 DataFrame,形状与 self DataFrame 相同。
  • pandas.DataFrame.all(axis=1): 在布尔型 DataFrame 上调用时,all(axis=1) 会检查每一行中的所有布尔值是否都为 True。如果一行中的所有元素都为 True,则该行对应的结果为 True;否则为 False。这会返回一个布尔型的 Series。
  • numpy.where(): 这是一个条件选择函数,类似于 Excel 中的 IF 函数。它接受三个参数:condition(一个布尔数组或 Series),x(当条件为 True 时的值),y(当条件为 False 时的值)。它会根据 condition 的真假,从 x 或 y 中选择相应的值。

3. 实现步骤与示例代码

下面我们将分步演示如何结合这些工具来解决问题。

3.1 步骤一:识别匹配的行

首先,我们使用 data1.isin(data2) 来生成一个布尔型 DataFrame,指示 data1 中的每个元素是否在 data2 的对应列中存在。

免费语音克隆
免费语音克隆

这是一个提供免费语音克隆服务的平台,用户只需上传或录制一段 5 秒以上的清晰语音样本,平台即可生成与用户声音高度一致的 AI 语音克隆。

下载
# 检查 data1 中的每个元素是否在 data2 的对应列中
element_wise_presence = data1.isin(data2)
print("\n元素级存在性检查 (data1.isin(data2)):")
print(element_wise_presence)

输出的 element_wise_presence DataFrame 会显示 data1 中每个单元格的值是否在 data2 的对应列中出现。例如,data1 的第一行 A=1, B='apple', C=10:

  • 1 在 data2['A'] 中存在 (True)
  • 'apple' 在 data2['B'] 中存在 (True)
  • 10 在 data2['C'] 中存在 (True) 因此,element_wise_presence 的第一行将是 [True, True, True]。

接下来,我们需要确定 data1 中的哪些行是“完全匹配”的。这里,“完全匹配”的定义是:该行中所有列的元素都在 data2 的对应列中存在。这可以通过对 element_wise_presence DataFrame 使用 all(axis=1) 来实现。

# 检查每一行是否所有元素都存在于 data2 的对应列中
row_match_condition = data1.isin(data2).all(axis=1)
print("\n行匹配条件 (data1.isin(data2).all(axis=1)):")
print(row_match_condition)

row_match_condition 将是一个布尔 Series,其中 True 表示 data1 中该行的所有元素都在 data2 的对应列中找到,False 则表示至少有一个元素不匹配。

3.2 步骤二:根据条件赋值新列

有了 row_match_condition 这个布尔 Series,我们就可以使用 np.where() 来为 data1 创建一个新的列 new_col。

  • 当 row_match_condition 为 True 时,new_col 的值为 "Open"。
  • 当 row_match_condition 为 False 时,new_col 的值为 "New"。
# 使用 np.where 根据条件赋值新列
data1['new_col'] = np.where(row_match_condition, 'Open', 'New')

print("\n最终结果 DataFrame 1:")
print(data1)

至此,我们成功地根据 data1 中行的存在性(通过元素在 data2 对应列中的存在性来判断)为 data1 添加了一个新的条件列。

4. 完整代码示例

将上述步骤整合到一起,完整的代码如下:

import pandas as pd
import numpy as np

# 示例数据
data1 = pd.DataFrame(
    {'A': [1, 2, 3, 4, 5],
     'B': ['apple', 'banana', 'orange', 'apple', 'grape'],
     'C': [10, 20, 30, 40, 50]})

data2 = pd.DataFrame(
    {'A': [1, 2, 6],
     'B': ['apple', 'banana', 'kiwi'],
     'C': [10, 20, 60]})

print("原始 DataFrame 1:")
print(data1)
print("\n原始 DataFrame 2:")
print(data2)

# 核心逻辑:比较并赋值
data1['new_col'] = np.where(data1.isin(data2).all(axis=1), 'Open', 'New')

print("\n处理后的 DataFrame 1:")
print(data1)

5. 注意事项

  • 列名匹配: isin(DataFrame) 方法会根据列名进行匹配。这意味着 data1 和 data2 应该具有相同的列名,或者至少是需要比较的列名相同。如果列名不一致,isin() 将无法正确比较,可能导致所有结果都为 False。
  • 数据类型: 确保参与比较的列具有兼容的数据类型。例如,整数与浮点数、字符串与数字的比较可能会产生非预期结果。
  • “行存在”的定义: 本教程中“行存在”的定义是:data1 中某一行所有元素都在 data2 的对应列中存在。这与“data1 中某一行作为一个整体与 data2 中的某一行完全相同”略有不同。在大多数情况下,isin().all(axis=1) 的方法是有效的,特别是当 data2 包含的是 data1 中行的有效组合时。如果需要严格的“整行匹配”,可以考虑其他方法,例如将行转换为元组或字符串进行比较,或者使用 merge 操作(例如 pd.merge(data1, data2, how='left', indicator=True))。
  • 性能: 对于非常大的 DataFrame,isin() 可能会消耗较多的内存和计算资源。在处理亿级别数据时,可能需要考虑其他优化策略,如使用 Dask 或 PySpark。
  • 缺失值(NaN): isin() 对 NaN 的处理需要注意。NaN 不等于 NaN,因此 data1.isin(data2) 在比较 NaN 值时通常会返回 False,除非 data2 的对应列中也显式包含 NaN。

6. 总结

通过结合 pandas.DataFrame.isin()、pandas.DataFrame.all(axis=1) 和 numpy.where(),我们可以高效且灵活地实现 DataFrame 之间的条件比较和新列赋值。这种方法在数据分析和预处理中非常实用,能够帮助用户快速识别和标记符合特定条件的数据行,从而简化后续的数据操作。理解这些函数的内部机制和注意事项,将有助于更准确和高效地处理复杂的 DataFrame 比较任务。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

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

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

78

2025.12.04

Python 数据清洗与预处理实战
Python 数据清洗与预处理实战

本专题系统讲解 Python 在数据清洗与预处理中的核心技术,包括使用 Pandas 进行缺失值处理、异常值检测、数据格式化、特征工程与数据转换,结合 NumPy 高效处理大规模数据。通过实战案例,帮助学习者掌握 如何处理混乱、不完整数据,为后续数据分析与机器学习模型训练打下坚实基础。

32

2026.01.31

数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

337

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

224

2025.10.31

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

138

2026.02.12

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

846

2023.08.22

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

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

760

2023.08.03

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

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

221

2023.09.04

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

3

2026.03.11

热门下载

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

精品课程

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

共162课时 | 21万人学习

成为PHP架构师-自制PHP框架
成为PHP架构师-自制PHP框架

共28课时 | 2.6万人学习

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

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