使用Pandas合并重复时间戳行并填充NaN值的高效实现方案求助
Pandas合并重复时间戳行并填充NaN值的高效实现方案求助
嗨,针对你遇到的这个合并重复时间戳行的问题,我有几个高效简洁的解决方案可以分享给你:
首先先明确你的需求:你需要将DataFrame中同一Tijdstempel apparaat(时间戳)对应的多行数据合并为一行,让这一行包含所有行中的非空值,同时避免手动处理的繁琐和低效。
你之前尝试的问题分析
- 用
groupby+max()/sum()的方式,因为不同列的数据类型(比如数值、字符串)适配性差,导致无法正确保留所有非空值甚至丢失列; - 手动针对单个时间戳填充后删行的方式,代码臃肿且需要遍历所有重复时间戳,处理大文件时效率极低。
高效解决方案
方案一:分组后双向填充+去重(通用场景)
这个方法适用于同一时间戳下同一列只有一个有效值的场景,通过双向填充快速补全组内所有行的NaN,再去重保留一行即可,代码简洁且效率高:
import pandas as pd # 假设你的原始数据集是df # 按时间戳分组,对每组先向后填充NaN,再向前填充,确保组内每行都是完整数据 df_filled = df.groupby('Tijdstempel apparaat').apply(lambda group: group.bfill().ffill()).reset_index(drop=True) # 去重保留每个时间戳的唯一行 df_merged = df_filled.drop_duplicates(subset='Tijdstempel apparaat')
方案二:自定义聚合函数取首个有效值(更高效)
如果确定同一时间戳下每列只有一个非空值,可以直接用自定义聚合函数提取每列的首个有效值,避免填充操作,效率更高:
import pandas as pd import numpy as np def get_first_valid(series): # 提取列中的非空值,返回第一个;全空则返回NaN non_null_vals = series.dropna() return non_null_vals.iloc[0] if not non_null_vals.empty else np.nan # 按时间戳分组,对所有列应用自定义聚合函数 df_merged = df.groupby('Tijdstempel apparaat').agg(get_first_valid).reset_index()
方案三:处理多值字符串列(如备注合并)
如果你的Notities(备注)列在同一时间戳下有多个不同的非空值,想要合并这些内容,可以针对该列单独设置聚合规则:
# 针对不同列设置不同聚合逻辑 df_merged = df.groupby('Tijdstempel apparaat').agg( { 'Scan Glucose mmol/l': get_first_valid, 'Snelwerkende insuline (eenheden)': get_first_valid, 'Koolhydraten (gram)': get_first_valid, 'Notities': lambda x: ', '.join(x.dropna().unique()) # 合并所有不重复的备注内容 } ).reset_index()
为什么这些方案更优
这些方法都是基于Pandas原生优化的groupby操作,不需要手动遍历每个时间戳,处理大体积的data.csv时速度会比手动处理快很多,同时代码结构清晰,后续维护也更方便。
备注:内容来源于stack exchange,提问作者kees prince
相关产品推荐
相关产品推荐

