使用 Pandas Pivot 和 Fillna 合并数据帧以补全缺失值

聖光之護
发布: 2025-10-05 15:11:01
原创
168人浏览过

使用 pandas pivot 和 fillna 合并数据帧以补全缺失值

本文介绍了如何使用 Pandas 的 pivot 和 fillna 函数,结合 map 函数,将两个数据帧合并,并用第二个数据帧中的值来填充第一个数据帧中的缺失值。针对数据帧透视、缺失值填充以及处理重复 ID 的情况,提供了清晰的代码示例和详细的步骤说明,帮助读者高效完成数据处理任务。

问题背景

在数据处理过程中,经常会遇到需要将多个数据帧合并,并使用一个数据帧的值来填充另一个数据帧缺失值的情况。例如,一个数据帧记录了连接(conn)和断开连接(disconn)的时间,但某些 ID 可能缺少断开连接的时间。此时,我们可以使用另一个包含 ID 和断开连接时间的数据帧来补全这些缺失值。

解决方案

可以使用 Pandas 的 pivot 函数将第一个数据帧转换为所需的格式,然后使用 fillna 函数和 map 函数来填充缺失的断开连接时间。

具体步骤

  1. 数据准备

首先,准备两个数据帧 table1 和 table2。table1 包含 ID、时间和状态(conn 或 disconn),table2 包含 ID 和时间。

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 转换为以 ID 为索引,状态(conn 和 disconn)为列的数据帧。

out = (table1.pivot(index='id', columns='status', values='time')
             .reset_index().rename_axis(columns=None)
      )
登录后复制

这段代码首先使用 pivot 函数将数据透视,然后使用 reset_index() 将 ID 重新设置为一列,最后使用 rename_axis(columns=None) 移除列名的轴名称。

  1. 缺失值填充

使用 fillna 函数和 map 函数,将 table2 中的断开连接时间填充到 out 数据帧中。

out['disconn'] = out['disconn'].fillna(out['id'].map(table2.set_index('id')['time']))
登录后复制

这段代码首先使用 set_index('id') 将 table2 的 ID 列设置为索引,然后使用 ['time'] 选择时间列。接着,使用 map 函数将 out 数据帧中的 ID 映射到 table2 的时间,最后使用 fillna 函数填充 out 数据帧中 disconn 列的缺失值。

怪兽智能全息舱
怪兽智能全息舱

专业的AI数字人平台,定制数字人专属IP

怪兽智能全息舱 0
查看详情 怪兽智能全息舱

另一种实现方式:

m = out['disconn'].isna()
out.loc[m, 'disconn'] = out.loc[m, 'id'].map(table2.set_index('id')['time'])
登录后复制

这种方法首先创建一个布尔掩码 m,指示 disconn 列中哪些值是缺失的。然后,使用 .loc 访问器,仅在 m 为 True 的行上,将 disconn 列的值替换为 table2 中对应 ID 的时间。

  1. 结果展示

最终的结果 out 数据帧包含 ID、连接时间和断开连接时间,并且缺失的断开连接时间已使用 table2 中的值填充。

print(out)
登录后复制

输出结果:

   id   conn disconn
0   1  10:00   10:01
1   2  10:02   10:03
2   3  10:04   10:05
登录后复制

处理重复 ID/状态

如果 table1 中存在重复的 ID 和状态组合,需要先使用 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 和状态分组后的累积计数。然后,使用 pivot 函数将数据透视,将 ID 和计数器作为索引,状态作为列。最后,使用 reset_index() 和 rename_axis(columns=None) 重置索引和列名。

总结与注意事项

  • pivot 函数用于将数据帧转换为所需的格式,需要指定索引、列和值。
  • fillna 函数用于填充缺失值,可以结合 map 函数使用,根据其他数据帧的值进行填充。
  • 如果数据帧中存在重复的 ID 和状态组合,需要先使用 groupby 函数和 cumcount 函数添加一个计数器列,然后再进行数据透视。
  • 在实际应用中,需要根据具体的数据情况调整代码,例如,可能需要处理不同的数据类型或缺失值表示。

通过本文的介绍,读者可以掌握使用 Pandas 的 pivot 和 fillna 函数,结合 map 函数,将两个数据帧合并,并用第二个数据帧中的值来填充第一个数据帧中的缺失值的方法。这在数据处理和分析中是一个非常有用的技巧。

以上就是使用 Pandas Pivot 和 Fillna 合并数据帧以补全缺失值的详细内容,更多请关注php中文网其它相关文章!

相关标签:
最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
热门推荐
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

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