如何基于多列相同值合并pandas DataFrame中的多行数据
解决代码
你可以通过分组聚合直接提取每列的唯一非空值实现需求,适配字符串、数值等所有数据类型,符合你提到的「同分组下每列仅存在一个非NaN值」的前置条件:
import pandas as pd import numpy as np df = df.groupby( by=["id", "date", "freq", "year"], as_index=False ).agg( lambda col: col.dropna().iloc[0] if col.notna().any() else np.nan )
报错原因说明
你之前使用max()抛出ValueError,通常是因为你的DataFrame存在非标准索引设置、或者分组键列存在异常值/重复定义导致的,上述聚合写法规避了max()对数据结构和类型的隐含要求,稳定性更强。
高效替代方案
如果你的数据量较大,可以使用填充去重的方案提升运行效率:
df = df.groupby( by=["id", "date", "freq", "year"], group_keys=False ).apply( lambda x: x.ffill().bfill() ).drop_duplicates( subset=["id", "date", "freq", "year"], keep="first" )
两种方案都只会合并四列完全相同的行,不会跨组合并行,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Shashank Gandham
相关产品推荐
相关产品推荐

