讲师中心 微信公众号
AI工具推荐 视频效率加速

使用 Pandas Pivot 和 Fillna 合并数据帧以填充缺失值

老磊姑娘_4156

老磊姑娘_4156

发布时间:2025-10-06 11:52:33

|

1079人浏览过

|

来源于php中文网

原创

使用 pandas pivot 和 fillna 合并数据帧以填充缺失值

本文介绍了如何使用 Pandas 的 pivot 和 fillna 方法,结合 map 函数,将两个数据帧合并并填充缺失值。主要解决的问题是,当一个数据帧中缺少特定 ID 的某些状态值时,如何从另一个数据帧中获取这些缺失值并进行填充,最终生成一个包含完整信息的数据帧。

问题描述

假设我们有两个数据帧 table1 和 table2。table1 包含 id、time 和 status 列,记录了不同 ID 在不同时间的连接和断开状态。table2 包含 id 和 time 列,记录了某些 ID 的时间信息。我们的目标是将 table1 转换为一个透视表,其中 id 作为索引,status 作为列,time 作为值。如果某个 ID 缺少断开连接 (disconn) 的时间值,则从 table2 中获取相应 ID 的时间值进行填充。

解决方案

以下是使用 Pandas 实现该目标的步骤:

  1. 数据准备

首先,我们需要创建示例数据帧:

import pandas as pd

table1 = pd.DataFrame({
    'id': [1, 1, 2, 2, 3],
    'time': ['10:00', '10:01', '10:02', '10:03', '10:04'],
    'status': ['conn', 'disconn', 'conn', 'disconn', 'conn']
})

table2 = pd.DataFrame({
    'id': [3],
    'time': ['10:05']
})
  1. 数据透视

使用 pivot 函数将 table1 转换为透视表:

out = (table1.pivot(index='id', columns='status', values='time')
             .reset_index().rename_axis(columns=None)
      )

这段代码首先使用 pivot 函数将 table1 以 id 为索引,status 为列,time 为值进行透视。然后,使用 reset_index() 将索引重置为列,并使用 rename_axis(columns=None) 移除列名的轴标签。

  1. 填充缺失值

使用 fillna 和 map 函数填充 disconn 列中的缺失值:

out['disconn'] = out['disconn'].fillna(out['id'].map(table2.set_index('id')['time']))

这段代码使用 fillna 函数填充 out 数据帧中 disconn 列的缺失值。fillna 函数的参数是一个 Series,该 Series 由 out['id'].map(table2.set_index('id')['time']) 生成。table2.set_index('id')['time'] 将 table2 的 id 列设置为索引,并选择 time 列,生成一个 Series。然后,out['id'].map() 将 out 数据帧的 id 列映射到该 Series,从而为每个 ID 找到对应的 time 值。如果 table2 中没有某个 ID 的 time 值,则映射结果为 NaN。

  1. 替代方案

以下是填充缺失值的替代方案:

m = out['disconn'].isna()
out.loc[m, 'disconn'] = out.loc[m, 'id'].map(table2.set_index('id')['time'])

这段代码首先创建一个布尔 Series m,指示 disconn 列中哪些值为 NaN。然后,使用 out.loc[m, 'disconn'] 选择 disconn 列中值为 NaN 的行,并使用 out.loc[m, 'id'].map() 将这些行的 id 列映射到 table2 的 time 列,从而填充缺失值。

  1. 处理重复的 ID/状态组合

如果 table1 中存在重复的 id/status 组合,则需要使用 groupby 和 cumcount 函数来处理:

out = (table1.assign(n=lambda d: d.groupby(['id', 'status']).cumcount())
             .pivot(index=['id', 'n'], columns='status', values='time')
             .reset_index().rename_axis(columns=None)
      )

这段代码首先使用 assign 函数创建一个新的列 n,该列的值是每个 id/status 组合的累积计数。然后,使用 pivot 函数将 table1 以 id 和 n 为索引,status 为列,time 为值进行透视。

完整代码示例

import pandas as pd

table1 = pd.DataFrame({
    'id': [1, 1, 2, 2, 3],
    'time': ['10:00', '10:01', '10:02', '10:03', '10:04'],
    'status': ['conn', 'disconn', 'conn', 'disconn', 'conn']
})

table2 = pd.DataFrame({
    'id': [3],
    'time': ['10:05']
})

out = (table1.pivot(index='id', columns='status', values='time')
             .reset_index().rename_axis(columns=None)
      )

out['disconn'] = out['disconn'].fillna(out['id'].map(table2.set_index('id')['time']))

print(out)

注意事项

  • 确保 table2 中包含所有需要在 table1 中填充的 ID。
  • 如果 table2 中存在重复的 ID,则 map 函数将返回第一个匹配的值。
  • 在处理重复的 id/status 组合时,需要使用 groupby 和 cumcount 函数来创建唯一的索引。

总结

本文介绍了如何使用 Pandas 的 pivot 和 fillna 方法,结合 map 函数,将两个数据帧合并并填充缺失值。这种方法可以有效地处理数据缺失问题,并生成包含完整信息的数据帧。通过掌握这些技巧,可以更加高效地进行数据处理和分析。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

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

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

300

2025.12.04

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

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

212

2026.01.31

Python数据分析与Pandas高级实战
Python数据分析与Pandas高级实战

本专题围绕 Python 数据分析展开,系统讲解 Pandas 的高级用法,包括数据清洗、透视表、时间序列分析以及多表合并与分组操作。通过实战案例,帮助开发者掌握高效处理与分析数据的方法,提高数据处理效率与分析能力。

331

2026.04.13

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

430

2025.09.05

golang map相关教程
golang map相关教程

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

323

2025.11.16

golang map原理
golang map原理

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

493

2025.11.17

java判断map相关教程
java判断map相关教程

本专题整合了java判断map相关教程,阅读专题下面的文章了解更多详细内容。

243

2025.11.27

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

120

2026.09.23

Buffalo框架路由与请求处理实操指南
Buffalo框架路由与请求处理实操指南

本专题讲解Buffalo框架路由与请求处理机制,涵盖路由注册与分组、资源路由、Handler编写规范、Context上下文方法、参数绑定、中间件编写挂载、Session与Cookie读写、Flash消息及错误页面定制方法。

40

2026.09.23

热门下载

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

精品课程

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn