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

Pandas如何合并相同日期不同时间行,整合同一ID的多时段分散数据

实现方案

方案1:groupby + first 聚合(最简洁,适配当前场景)

核心逻辑:按ID和日期分组后,first()方法会自动跳过空值,取每组每列的第一个非空值,刚好匹配把分散的非空值聚合到同一行的需求。

# 第一步:将Date列转为datetime格式(如果已经是timestamp格式可跳过该步)
df1['Date'] = pd.to_datetime(df1['Date'])

# 第二步:按ID+日期分组,聚合所有非空值
# 分组时直接用Date列的日期属性作为分组键,无需额外生成列
result = df1.groupby(['ID', df1['Date'].dt.date], as_index=False).first()

# 若需要保留原始时间列的最早时间,可指定每列的聚合规则:
# result = df1.groupby(['ID', df1['Date'].dt.date], as_index=False).agg(
#     Date = ('Date','min'),
#     Name = ('Name','first'),
#     Height = ('Height','first'),
#     Weight = ('Weight','first'),
#     Gender = ('Gender','first'),
#     Interests = ('Interests','first')
# )

如果要求严格按时间先后顺序取非空值,分组前先执行df1 = df1.sort_values('Date')即可。

方案2:自定义聚合函数(适配更复杂场景)

如果存在同一列、同一ID同日期下有多个非空值需要合并的情况,可以用自定义聚合函数实现:

def merge_non_null(series):
    # 过滤空值后去重
    non_null_vals = series.dropna().unique()
    if len(non_null_vals) == 0:
        return np.nan
    elif len(non_null_vals) == 1:
        return non_null_vals[0]
    # 多非空值时用逗号拼接返回
    return ','.join(non_null_vals.astype(str))

df1['Date'] = pd.to_datetime(df1['Date'])
result = df1.groupby(['ID', df1['Date'].dt.date], as_index=False).agg(merge_non_null)

示例数据运行结果

最终输出会得到3行数据,符合每个ID每个日期仅一行的要求:

IDDateNameHeightWeightGenderInterests
A2021-09-20xx17474MaleHiking,Sports
B2021-09-01yy16058FemaleNaN
B2021-09-02yy16058NaNSinging

内容的提问来源于stack exchange,提问作者Shiva

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 21:09:03