0

0

如何在 Python 中按 ID 列合并多行数据为单行(保留各列非空值)

碧海醫心

碧海醫心

发布时间:2026-03-05 20:52:03

|

295人浏览过

|

来源于php中文网

原创

如何在 Python 中按 ID 列合并多行数据为单行(保留各列非空值)

本文介绍使用 pandas 对具有相同 id 的重复行进行智能合并的方法:通过 bfill() + groupby().head(1) 或 ffill() + tail(1),自动填充并聚合每组中各列的首个有效值,实现“空值互补、一行归总”的清洗目标。

本文介绍使用 pandas 对具有相同 id 的重复行进行智能合并的方法:通过 bfill() + groupby().head(1) 或 ffill() + tail(1),自动填充并聚合每组中各列的首个有效值,实现“空值互补、一行归总”的清洗目标。

在数据清洗与报表生成场景中,常遇到原始数据因分步采集、多源拼接或系统导出限制,导致同一业务实体(如 P ID)被拆分为多行,仅在部分列(如 Q1、Q2、Q3)填写内容,其余为空(NaN 或空字符串)。此时简单去重(drop_duplicates())会丢失信息,而直接取 first()/last() 又可能遗漏关键字段。理想的合并策略是:对每个 ID 分组,将各列的非空值“补全”到同一行中,优先保留任意一个有效值即可

pandas 提供了一种简洁高效的解决方案:利用前向填充(ffill)或后向填充(bfill)配合分组取首行(head(1))或末行(tail(1)),实现跨行信息聚合。

✅ 推荐方法:bfill().head(1)(推荐用于多数场景)

该方法对每组内行按从下到上顺序填充(即用下方的有效值向上覆盖),再取第一行——等效于“取每列第一个非空值”。

import pandas as pd
import numpy as np

# 构造示例数据(模拟原始 Excel 导入结果)
df = pd.DataFrame({
    "P ID": [318, 318, 319, 319],
    "T ID": [495, 495, 496, 496],
    "C ID": ["00036282", "00036282", "00036283", "00036283"],
    "Q1": ["NO", None, "Yes", None],
    "Q2": [None, "Yes", None, "Yes"],
    "Q3": [None, "All cost covered", "No additional costs", None],
})

# 按 P ID 分组,对每组执行 bfill 后取首行
merged_df = df.groupby("P ID").apply(lambda x: x.bfill().head(1)).reset_index(drop=True)
print(merged_df)

输出:

立即学习Python免费学习笔记(深入)”;

   P ID  T ID      C ID    Q1    Q2                   Q3
0   318   495  00036282    NO   Yes  All cost covered
1   319   496  00036283   Yes   Yes  No additional costs

? 原理说明:bfill() 将每组内 Q1 列的 "NO" 向上填充(但本例中上方无空位),Q2 的 "Yes" 向上填充至第 0 行,Q3 的 "All cost covered" 同理;随后 head(1) 提取每组填充后最靠上的完整行,自然汇集所有非空字段。

⚙️ 替代方案:ffill().tail(1)

若数据中有效值更常出现在上方(如首行为主记录,后续行为补充),可改用前向填充 + 取末行:

Spacely AI
Spacely AI

为您的房间提供AI室内设计解决方案,寻找无限的创意

下载
merged_df_alt = df.groupby("P ID").apply(lambda x: x.ffill().tail(1)).reset_index(drop=True)

效果一致,逻辑对称,可根据实际数据分布习惯选择。

⚠️ 注意事项与最佳实践

  • 空值类型需统一:确保缺失值为 pd.NA 或 np.nan(而非空字符串 "" 或 " ")。若存在空字符串,建议预处理:

    df = df.replace(r'^\s*$', np.nan, regex=True)  # 清理空白字符串
  • ID 列必须完全一致:P ID、T ID、C ID 等分组键需严格匹配(注意数据类型,避免 int 与 str 混用)。可强制转换:

    df["P ID"] = df["P ID"].astype(str).str.strip()
  • 不适用于需聚合计算的数值列:此方法本质是“取非空值”,不支持求和、均值等统计操作。若含数值列且需汇总,请单独定义聚合函数(如 agg({'amount': 'sum', 'Q1': lambda x: x.dropna().iloc[0] if not x.dropna().empty else None}))。

  • 性能提示:对超大数据集(>100 万行),避免在 apply 中调用 bfill;可改用 groupby(...).bfill().drop_duplicates(subset=['P ID'], keep='first') 实现等效逻辑,效率更高。

✅ 总结

面对“同 ID 多行、各列填空式分布”的典型脏数据,groupby().bfill().head(1) 是兼顾简洁性、可读性与鲁棒性的首选方案。它无需手动指定每列聚合方式,自动识别并提取每组内各字段的首个有效值,完美适配问卷类、工单类、客户档案类数据的标准化整合需求。将其嵌入 ETL 流程,即可将 3130 行原始数据稳定压缩至约 900 行高质量结果,真正实现自动化、零人工干预的精准合并。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

76

2025.12.04

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

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

12

2026.01.31

数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

333

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

223

2025.10.31

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

138

2026.02.12

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

839

2023.08.22

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

718

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

219

2023.09.04

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

4

2026.03.05

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 4.8万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.8万人学习

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

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