新闻中心

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

2025-11-29
浏览次数:
返回列表

基于键值条件高效映射 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

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

N世界 N世界

一分钟搭建会展元宇宙

N世界 138 查看详情 N世界
  • 重复性高: 对于每个需要映射的列,都需要重复编写 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'

以上就是基于键值条件高效映射 Pandas DataFrame 多列数据的详细内容,更多请关注其它相关文章!


# 解决问题  # 银行卡推广营销方案范文  # 杏坛桂城网站建设  # 邯郸seo网站优化  # 祖庙网站建设教程  # 楼盘推广营销方案  # 兴义seo网站优化  # 网站线下推广方案  # 武汉抖音营销推广排名  # 山东网站建设制作定制  # 网站建设员工职业  # 工具  # 数据处理  # 中文网  # 相关文章  # 是一个  # 如何使用  # 矢量化  # 键值  # 掩码  # 布尔  # 数据清洗 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: Safari浏览器输入栏卡顿如何解决 Safari搜索建议与缓存清理  sublime如何配置Go语言开发环境_sublime搭建Golang编译运行系统  深入理解Go语言中Map值与方法接收器的交互:为什么需要临时变量  地铁跑酷免费秒玩入口链接 地铁跑酷小游戏免费秒玩网站  Golang如何通过reflect操作map_Golang reflect map操作与遍历技巧  漫蛙2正版漫画站 漫蛙2网页版快速访问入口  12306选座怎么选到商务座_12306商务座选择与配置说明  QQ网页版官方账号入口 QQ网页版网页版登录指南  CSS条件样式无法按设备触发怎么排查_media条件语句正确设置解决触发问题  J*aScript实现动态背景色下的文本与按钮颜色自适应调整  PHP表单数据传递:如何通过隐藏输入字段获取动态ID  Golang并发任务中错误如何聚合_Golang goroutine error收集方式  PostgreSQL海量数据高效导入策略:Python与Django实践指南  不同用户不同价格! 索尼开启账户个性化定价测试  漫蛙manwa2最新登录网址_漫蛙manwa2手机网页版入口  QQ邮箱网页版入口页面 QQ邮箱在线登录入口官网  c++如何实现一个简单的软件渲染器_c++从零开始的3D图形学  漫蛙MANWA漫画主页官方入口 漫蛙漫画最新在线阅读地址  利用Bokeh CustomJS动态控制DataTable列可见性  2025俄罗斯Yandex最新入口 官方网站地址及浏览器下载指南  2025AO3夸克浏览器通道_AO3手机HTTPS安全入口分享  Odoo 16:在表单视图中基于当前记录动态修改Tree视图属性  如何在网页中实现特定地点的随机图片展示  Vue.js 图片显示异常排查:理解应用挂载范围与DOM ID唯一性  如何在 Excel Online 和 Google 表格中更改日期格式  c++20的std::jthread是什么_c++可中断线程与RAII式管理  如何在J*a中使用Locale处理多语言环境  qq浏览器如何查看和导出已保存的密码 qq浏览器密码管理器数据备份教程  汽水音乐车机版横屏版7.1 汽水音乐车机版横屏版下载入口  b站如何看历史记录_b站观看历史找回方法  C++如何实现线程池_C++11手动实现一个简单的固定大小线程池  聚水潭ERP登录页面入口 聚水潭ERP官网登录界面  《主播少女的秘密账号迷宫》首支宣传片  在J*a中如何捕获IndexOutOfBoundsException_索引越界异常防护方法说明  将JSON对象数组转置为键值对列表的实用指南  小米汽车11月交付量突破40000台!雷军:将继续努力  解决 Vaadin 8 中大文件音频播放与定位时出现的 IOException  妖精动漫免费平台 妖精动漫官网资源观看网址  React Router v6 教程:构建认证保护的私有路由与重定向策略  c++中的const_cast和reinterpret_cast怎么用_c++四种类型转换  Win10怎么设置静态IP地址 Win10手动配置IP地址步骤【指南】  TypeScript/J*aScript:高效查找数组中首个唯一ID对象  Golang如何使用const iota_Go iota常量计数器讲解  163邮箱登录密码 163邮箱忘记密码找回  Golang如何实现简单的Web表单_Golang表单提交与验证处理方法  J*a中实现Go语言select通道多路复用机制  微信聊天记录怎么加密_微信聊天记录加密方法  铁路12306的积分有效期是多久_铁路12306积分有效期说明  css卡片内容溢出如何处理_使用overflow隐藏或scroll显示内容  Golang如何处理RPC请求负载均衡_Golang RPC请求负载均衡策略与实践 

搜索