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

使用 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 实现该目标的步骤:

数据准备

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

import pandas as pdtable1 = 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']})

数据透视

使用 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) 移除列名的轴标签。

填充缺失值

使用 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。

替代方案

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

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 列,从而填充缺失值。

处理重复的 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 pdtable1 = 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 函数,将两个数据帧合并并填充缺失值。这种方法可以有效地处理数据缺失问题,并生成包含完整信息的数据帧。通过掌握这些技巧,可以更加高效地进行数据处理和分析。

以上就是使用 Pandas Pivot 和 Fillna 合并数据帧以填充缺失值的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1375953.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月14日 15:29:05
下一篇 2025年12月14日 15:29:12

相关推荐

  • 优化Tkinter应用性能:应对主题渲染迟缓的策略

    本文探讨了Tkinter主题在Windows和macOS平台上渲染大量控件时可能出现的性能瓶颈,特别是对于依赖图像的自定义主题。针对应用运行缓慢的问题,文章提供了优化策略,包括推荐使用性能更优的sv-ttk主题,并建议在追求极致性能和现代UI时考虑其他GUI工具包,以提升用户体验。 Tkinter主…

    好文分享 2025年12月14日
    000
  • 动态安装和使用 PyPi 包:在 PyInstaller 打包的软件中实现

    本文旨在解决在通过 PyInstaller 打包的 Python 软件中,如何动态安装和使用 PyPi 包的问题。我们将探讨两种主要方法:直接使用 pip 模块和通过 subprocess 调用 pip 命令,并详细介绍如何在 PyInstaller 创建的 _internal 目录中安装包,从而允…

    2025年12月14日
    000
  • 利用NumPy处理3D数组中包含NaN值的列均值计算与填充

    本教程旨在解决如何在3D NumPy数组中,为每个2D子数组计算其列的均值(忽略NaN值),并使用这些计算出的均值来填充原始数组中的NaN值。文章将详细介绍如何利用np.nanmean函数进行NaN-aware的均值计算,并通过np.newaxis进行数组维度扩展以实现正确的广播操作,最终完成数据的…

    2025年12月14日
    000
  • 使用 UBI8-Python 镜像在 Docker 中安装和使用 Pip

    本文档旨在解决在使用 Red Hat UBI8-Python 镜像构建 Docker 镜像时,pip 命令无法找到的问题。通过分析镜像环境,找到 pip 的实际路径,并提供正确的 pip 命令使用方式,帮助开发者顺利安装 Python 依赖。本文还介绍了如何查找 Python 和 Pip 的安装路径…

    2025年12月14日
    000
  • 在 AutoCAD 中使用 PyAutoCAD 自动缩放至全部对象可见

    本文旨在介绍如何使用 PyAutoCAD 库在 AutoCAD 中打开模型空间时,自动缩放视图,使所有对象都能立即显示在屏幕上。通过 Application.ZoomExtents 方法,您可以轻松实现这一功能,提升绘图效率。 在 AutoCAD 中,有时打开一个包含多个对象的模型时,视图可能不会自…

    2025年12月14日
    000
  • JAX 分布式数组离散差分计算的性能优化策略

    在JAX中,对分布式(Sharded)数组执行离散差分计算时,性能优化取决于数据分片策略。本文通过一个具体示例,揭示了沿差分轴进行分片可能导致显著的性能下降,原因在于引入了高昂的跨设备通信开销。相反,垂直于差分轴的分片策略则能有效利用并行计算优势,避免不必要的通信,从而实现更高效的计算。理解数据依赖…

    2025年12月14日
    000
  • 优化 QLoRA 训练:解决大批量尺寸导致训练时间过长的问题

    正如摘要中所述,在使用 QLoRA 微调 openlm-research/open_llama_7b_v2 模型时,如果遇到增加 per_device_train_batch_size 反而导致训练时间显著增加的问题,通常是由于训练步数 max_steps 的配置不当引起的。接下来,我们将详细分析原…

    2025年12月14日
    000
  • 输出格式要求:海龟越界检测失效:条件判断的常见错误与正确实现

    本文旨在解决海龟绘图程序中越界检测失效的问题。通过分析常见的逻辑错误,例如将比较运算符与逻辑运算符混用,以及对 Python 中真值判断的误解,本文详细解释了如何正确地使用条件语句来判断海龟是否超出设定的边界,并提供了修改后的代码示例,确保海龟在越界时能够正确地改变方向。 在使用 Python 的 …

    2025年12月14日
    000
  • 解决 Jupyter Notebook WebSocket 连接关闭错误

    本文旨在帮助开发者解决在使用 Jupyter Notebook API 通过 WebSocket 连接执行代码时遇到的 “socket is already closed” 错误。我们将分析错误原因,并提供通过重新连接 WebSocket 并确保消息格式正确来解决此问题的方案…

    2025年12月14日
    000
  • Python中将时间戳转换为日期格式

    本文介绍了如何在Python中将类似于/Date(1680652800000)/格式的时间戳转换为可读的日期格式。通过字符串切片提取时间戳,并结合datetime模块进行转换,同时需要注意时间戳的Epoch基准,确保转换的准确性。 在很多API接口中,日期数据以时间戳的形式返回,例如/Date(16…

    2025年12月14日
    000
  • dput上传Debian包时SSL证书验证失败的解决方案

    本教程针对使用dput工具上传Debian包到GitLab等私有仓库时,因自签名SSL证书导致的CERTIFICATE_VERIFY_FAILED错误,提供了一种直接修改dput脚本以绕过SSL验证的实用解决方案。此方法通过注入Python代码禁用默认SSL上下文的验证,帮助用户在受控环境中快速解决…

    2025年12月14日
    000
  • Python对象序列化:将嵌套的类与实例属性转换为字典

    本文探讨如何将包含嵌套对象及类属性、实例属性的Python对象结构转换为字典形式。通过引入一个可序列化的基类和自定义的to_dict()方法,我们能够递归地遍历并收集所有相关属性,从而实现复杂对象结构的便捷字典表示。该方案有效解决了__dict__无法直接访问类属性及嵌套对象内部属性的问题。 理解P…

    2025年12月14日
    000
  • 基于OpenCV的视频帧拼接:消除抖动,提升稳定性

    基于OpenCV的视频帧拼接:消除抖动,提升稳定性 在多摄像头视频拼接应用中,使用OpenCV的Stitcher类进行图像拼接是常见的方法。然而,直接使用该类处理视频流时,往往会出现拼接结果抖动的问题。这是因为Stitcher默认会对每一帧图像进行独立的相机参数校准,导致相邻帧之间产生轻微的扭曲,从…

    2025年12月14日
    000
  • 优化 QLoRA 训练:解决大 Batch Size 导致训练时间过长的问题

    本文将深入探讨在使用 QLoRA(Quantization-aware Low-Rank Adaptation)微调 openlm-research/open_llama_7b_v2 模型时,增大 per_device_train_batch_size 导致训练时间显著增加的问题。我们将分析可能的原…

    2025年12月14日
    000
  • PyTorch二分类模型准确率计算陷阱与修正:对比TensorFlow实践

    本文旨在解决PyTorch二分类模型训练过程中,准确率计算可能出现的常见错误,导致结果远低于预期。通过对比TensorFlow的实现,我们将深入分析PyTorch代码中准确率计算的陷阱,并提供正确的计算公式与实践方法,确保模型性能评估的准确性。 1. 问题背景与现象分析 在深度学习二分类任务中,模型…

    2025年12月14日
    000
  • python静态方法的用法

    静态方法是通过@staticmethod装饰器定义的、不依赖实例或类状态的工具函数,适合用于逻辑相关但无需访问属性的场景,如数据验证、数学计算等。 静态方法在 Python 中是一种特殊的方法类型,它不属于实例也不属于类,而是作为一个独立的函数被定义在类的内部。它的主要作用是将逻辑上相关的函数组织到…

    2025年12月14日
    000
  • 使用 cppyy 调用 C++ 库时 destroyModel 函数参数传递错误

    在使用 cppyy 调用 C++ 库时,遇到 TypeError: could not convert argument 1 错误,通常是因为 C++ 函数的参数类型与 Python 传递的参数类型不匹配。特别是当 C++ 函数的参数类型是引用时,cppyy 的默认行为可能无法正确处理。 问题描述 …

    2025年12月14日
    000
  • Python对象序列化:将类与实例属性递归转换为嵌套字典

    本文探讨了如何将Python类及其嵌套实例的类属性和实例属性递归地转换为一个结构化的字典。针对Python内置__dict__无法捕获类属性和嵌套对象深层属性的问题,我们提出并实现了一个Serializable基类,通过自定义的to_dict()方法,有效解决了对象及其复杂属性结构的序列化难题,最终…

    2025年12月14日
    000
  • python中Sobel算子是什么

    Sobel算子通过3×3卷积核计算图像梯度实现边缘检测,使用Gx和Gy分量结合幅值与方向判断边缘,具有抗噪性强、定位准确的优点,常用作图像处理预处理步骤。 Sobel算子是图像处理和计算机视觉中常用的一种边缘检测算子,主要用于检测图像中的梯度变化,从而识别出图像的边缘。它通过计算图像在水平和垂直方向…

    2025年12月14日
    000
  • python负值如何使用?

    负值在Python中用于数值计算和反向索引。-5+3得-2,-1表示最后一个元素,如text[-1]输出o,lst[-3]取20;切片nums[-3:]得[3,4,5],[::-1]可反转列表;注意索引越界会报错。 Python中的负值使用非常直接,主要用于数值计算、索引操作和控制流程等场景。负值就…

    2025年12月14日
    000

发表回复

登录后才能评论
关注微信