
本教程详细介绍了如何使用 Pandas 和 NumPy 高效地比较两个 DataFrame,并根据第一个 DataFrame 中的行是否存在于第二个 DataFrame 中,为新列赋值。通过 isin()、all(axis=1) 和 np.where() 的组合,可以实现灵活的条件逻辑,自动标记匹配或不匹配的数据行,这对于数据清洗、合并或状态追踪等场景非常实用。
在数据处理过程中,我们经常需要对比两个数据集,并根据对比结果更新其中一个数据集。一个典型的场景是:给定两个 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"。
要实现上述功能,我们将利用 Pandas 和 NumPy 中的几个关键函数:
下面我们将分步演示如何结合这些工具来解决问题。
首先,我们使用 data1.isin(data2) 来生成一个布尔型 DataFrame,指示 data1 中的每个元素是否在 data2 的对应列中存在。
# 检查 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:
接下来,我们需要确定 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 则表示至少有一个元素不匹配。
有了 row_match_condition 这个布尔 Series,我们就可以使用 np.where() 来为 data1 创建一个新的列 new_col。
# 使用 np.where 根据条件赋值新列
data1['new_col'] = np.where(row_match_condition, 'Open', 'New')
print("\n最终结果 DataFrame 1:")
print(data1)至此,我们成功地根据 data1 中行的存在性(通过元素在 data2 对应列中的存在性来判断)为 data1 添加了一个新的条件列。
将上述步骤整合到一起,完整的代码如下:
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)通过结合 pandas.DataFrame.isin()、pandas.DataFrame.all(axis=1) 和 numpy.where(),我们可以高效且灵活地实现 DataFrame 之间的条件比较和新列赋值。这种方法在数据分析和预处理中非常实用,能够帮助用户快速识别和标记符合特定条件的数据行,从而简化后续的数据操作。理解这些函数的内部机制和注意事项,将有助于更准确和高效地处理复杂的 DataFrame 比较任务。
以上就是Pandas DataFrame 高效比较与条件列赋值教程的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号