如何在Pandas合并DataFrame后仅保留首条匹配的price值,其余设为0
高效实现Pandas合并后仅保留每组首条price值
方法一:利用duplicated标记重复组
合并后,每个id+month组合的price值完全相同(因为df2中每个组合仅存一条记录),只需标记每组中除第一行外的重复行,将其price设为0即可:
# 执行左连接 merged_df = df1.merge(df2, how='left', on=['id', 'month']) # 标记每个(id, month)组的非首行 duplicate_mask = merged_df.duplicated(subset=['id', 'month'], keep='first') # 将非首行的price设为0 merged_df.loc[duplicate_mask, 'price'] = 0
方法二:分组后用transform处理
通过groupby按id和month分组,利用transform对每组的price列做针对性赋值,仅保留首条记录的原price,其余设为0:
merged_df = df1.merge(df2, how='left', on=['id', 'month']) # 分组处理price列 merged_df['price'] = merged_df.groupby(['id', 'month'])['price'].transform( lambda grp: grp.where(grp.index == grp.index[0], 0) )
效率说明
以上两种方法均为矢量化操作,基于Pandas底层的C优化实现,时间复杂度为O(n)(n为合并后DataFrame的行数),远优于逐行遍历的O(n²)方案,处理大数据量时优势明显。
内容的提问来源于stack exchange,提问作者ggupta
相关产品推荐
相关产品推荐

