You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 14:37:39