You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 04:26:55