0

0

基于键值条件高效映射 Pandas DataFrame 多列数据

花韻仙語

花韻仙語

发布时间:2025-11-29 13:08:17

|

816人浏览过

|

来源于php中文网

原创

基于键值条件高效映射 Pandas DataFrame 多列数据

本文介绍如何利用 pandas 和 numpy 高效地根据 dataframe 中“键”列的值,有条件地映射和处理多列数据。针对传统 `numpy.select` 逐列操作的低效性,教程将展示如何通过构建布尔掩码结合 `dataframe.where()` 方法实现矢量化操作,从而优化数据清洗和转换流程,将不符合条件的列值替换为指定标记(如 'na')。

1. 问题背景与传统方法局限性

在数据处理中,我们经常需要根据某一“键”列的值,有条件地修改或保留 DataFrame 中其他多列的数据。例如,当“键”列为 'key1' 时,我们可能只关心 'colA' 和 'colD' 的值,而其他列则应标记为无效。

以下是一个典型的场景及使用 numpy.select 的传统实现方式:

import pandas as pd
import numpy as np

# 创建示例 DataFrame
data = {
    'key': ['key1', 'key2', 'key3', 'key1', 'key2'],
    'colA': ['value1A', 'value2A', 'value3A', 'value4A', 'value5A'],
    'colB': ['value1B', 'value2B', 'value3B', 'value4B', 'value5B'],
    'colC': ['value1C', 'value2C', 'value3C', 'value4C', 'value5C'],
    'colD': ['value1D', 'value2D', 'value3D', 'value4D', 'value5D']
}
df = pd.DataFrame(data)

# 传统方法:为每列单独应用 np.select
df['colA'] = np.select([df['key'] == 'key1'], [df['colA']], default= 'NA')
df['colD'] = np.select([df['key'] == 'key1'], [df['colD']], default= 'NA')
df['colB'] = np.select([df['key'] == 'key2'], [df['colB']], default= 'NA')
df['colC'] = np.select([df['key'] == 'key3'], [df['colC']], default= 'NA')

print("使用 np.select 的结果:")
print(df)

输出结果:

使用 np.select 的结果:
    key     colA     colB     colC     colD
0  key1  value1A       NA       NA  value1D
1  key2       NA  value2B       NA       NA
2  key3       NA       NA  value3C       NA
3  key1  value4A       NA       NA  value4D
4  key2       NA  value5B       NA       NA

这种方法虽然能达到目的,但存在明显局限性:

EasySite
EasySite

零代码AI网站开发工具

下载
  • 重复性高: 对于每个需要映射的列,都需要重复编写 np.select 逻辑。
  • 扩展性差: 当需要处理的列数很多时,代码会变得冗长且难以维护。
  • 效率问题: 尽管 np.select 是矢量化的,但多次独立的列操作仍然不如一次性处理所有相关列高效。

为了解决这些问题,我们需要一种更高效、更具通用性的矢量化方法。

2. 基于布尔掩码的矢量化映射方法

Pandas 提供了强大的工具来构建和应用布尔掩码,实现对 DataFrame 的高效条件性修改。核心思想是创建一个与原始 DataFrame 形状相似的布尔矩阵,该矩阵的 True 值指示应保留原始数据,False 值指示应替换为默认值(如 'NA')。

2.1 核心思路

  1. 定义映射规则: 使用字典明确指定每个“键”值对应哪些目标列是有效的。
  2. 生成布尔掩码: 将映射规则转换为一个布尔 DataFrame,其中行代表“键”,列代表数据列,True 表示该键下该列有效。
  3. 对齐并应用掩码: 将生成的布尔掩码与原始 DataFrame 的“键”列对齐,然后使用 DataFrame.where() 方法一次性应用到所有目标列。

2.2 实现步骤与代码示例

首先,定义我们的映射规则,即哪个 key 对应哪些列是有效的:

import pandas as pd
import numpy as np

# 重新创建原始 DataFrame
data = {
    'key': ['key1', 'key2', 'key3', 'key1', 'key2'],
    'colA': ['value1A', 'value2A', 'value3A', 'value4A', 'value5A'],
    'colB': ['value1B', 'value2B', 'value3B', 'value4B', 'value5B'],
    'colC': ['value1C', 'value2C', 'value3C', 'value4C', 'value5C'],
    'colD': ['value1D', 'value2D', 'value3D', 'value4D', 'value5D']
}
df = pd.DataFrame(data)

# 1. 定义键与目标列的映射关系
# 例如:'key1' 对应 'colA' 和 'colD'

相关专题

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

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

53

2025.12.04

html编辑相关教程合集
html编辑相关教程合集

本专题整合了html编辑相关教程合集,阅读专题下面的文章了解更多详细内容。

16

2026.01.21

三角洲入口地址合集
三角洲入口地址合集

本专题整合了三角洲入口地址合集,阅读专题下面的文章了解更多详细内容。

17

2026.01.21

AO3中文版入口地址大全
AO3中文版入口地址大全

本专题整合了AO3中文版入口地址大全,阅读专题下面的的文章了解更多详细内容。

217

2026.01.21

妖精漫画入口地址合集
妖精漫画入口地址合集

本专题整合了妖精漫画入口地址合集,阅读专题下面的文章了解更多详细内容。

59

2026.01.21

java版本选择建议
java版本选择建议

本专题整合了java版本相关合集,阅读专题下面的文章了解更多详细内容。

3

2026.01.21

Java编译相关教程合集
Java编译相关教程合集

本专题整合了Java编译相关教程,阅读专题下面的文章了解更多详细内容。

14

2026.01.21

C++多线程相关合集
C++多线程相关合集

本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

6

2026.01.21

无人机驾驶证报考 uom民用无人机综合管理平台官网
无人机驾驶证报考 uom民用无人机综合管理平台官网

无人机驾驶证(CAAC执照)报考需年满16周岁,初中以上学历,身体健康(矫正视力1.0以上,无严重疾病),且无犯罪记录。个人需通过民航局授权的训练机构报名,经理论(法规、原理)、模拟飞行、实操(GPS/姿态模式)及地面站训练后考试合格,通常15-25天拿证。

25

2026.01.21

热门下载

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

精品课程

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

共58课时 | 3.9万人学习

Pandas 教程
Pandas 教程

共15课时 | 0.9万人学习

ASP 教程
ASP 教程

共34课时 | 3.9万人学习

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

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