如何基于ID与Time字段合并Pandas DataFrame中的分散数据行
实现方案
你之前仅调用df.groupby(['ID', 'Time'])仅会创建分组实例对象,没有指定聚合逻辑,因此不会返回合并后的结果表,按如下步骤操作即可得到预期结果:
步骤1:空值格式兼容
首先确保表中的空值是Pandas可识别的空类型,如果你表中的Nan是字符串格式,先做替换:
import pandas as pd df = df.replace('Nan', pd.NA)
步骤2:分组聚合
因为每个(ID, Time)分组下的每一列仅存在一个有效非空值,直接聚合提取非空值即可,最稳妥的写法不受字段值的行顺序影响:
result = df.groupby(['ID', 'Time'], as_index=False).agg(lambda col: col.dropna().iloc[0])
扩展方案(处理脏数据场景)
如果担心分组内同一列存在多个冲突的非空值,可自定义聚合逻辑,以下两种可选:
- 存在多个有效值时取最后一个有效值
result = df.groupby(['ID', 'Time'], as_index=False).agg(lambda col: col.dropna().iloc[-1])
- 存在多个有效值时抛出异常,方便排查数据问题
def get_unique_value(col): valid_values = col.dropna().unique() if len(valid_values) > 1: raise ValueError(f"分组存在多个冲突值:{valid_values}") return valid_values[0] if len(valid_values) > 0 else pd.NA result = df.groupby(['ID', 'Time'], as_index=False).agg(get_unique_value)
内容的提问来源于stack exchange,提问作者pariskey
相关产品推荐
相关产品推荐

