如何在Pandas中筛选ID相同且状态变更的行并生成新DataFrame
解决方案:更简便的Pandas处理方式
针对你的需求,这里提供两种比全量合并后逐列对比更高效简洁的方案:
方法一:索引映射+布尔筛选
通过构建id到status的映射关系,直接给df1匹配df2的状态,再快速筛选出状态变化的行,避免全量合并的冗余操作:
# 构建df2中id与status的映射字典 status_map = df2.set_index('id')['status'] # 给df1新增newstatus列,自动匹配对应id的df2状态(无匹配则为NaN) df1['newstatus'] = df1['id'].map(status_map) # 筛选条件:存在匹配id,且原status与新status不同 df3 = df1[(df1['newstatus'].notna()) & (df1['status'] != df1['newstatus'])].copy()
这种方式内存占用更低,数据量大时效率优势明显,因为只做一对一的映射,而非生成所有可能的匹配行。
方法二:链式merge+条件过滤
利用Pandas的链式调用,将合并、筛选、重命名一步完成,代码紧凑可读性强:
df3 = (df1.merge(df2[['id', 'status']], on='id', suffixes=('', '_new')) .loc[lambda df: df['status'] != df['status_new']] .rename(columns={'status_new': 'newstatus'}))
这里通过merge只保留两表共有的id,接着用loc直接过滤状态不同的行,最后重命名列得到目标df3,省去了中间变量的创建。
内容的提问来源于stack exchange,提问作者Lurri
相关产品推荐
相关产品推荐

