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每个日期仅一行的要求:
| ID | Date | Name | Height | Weight | Gender | Interests |
|---|---|---|---|---|---|---|
| A | 2021-09-20 | xx | 174 | 74 | Male | Hiking,Sports |
| B | 2021-09-01 | yy | 160 | 58 | Female | NaN |
| B | 2021-09-02 | yy | 160 | 58 | NaN | Singing |
内容的提问来源于stack exchange,提问作者Shiva
相关产品推荐
相关产品推荐

