如何基于另一DataFrame扩展DataFrame,补充非重复engine-id组合行
问题:扩展DataFrame并补充缺失的唯一组合行
需要将现有两个DataFrame(df1和df2)合并,补充df2中未在df1出现的engine与id组合行,最终结果无重复行。
现有DataFrame:
df1:
engine id F1 D2 J3 100234 F1 D2 J3 100238 K2 JM F2 200788 K2 JM F2 200790
df2:
engine id F1 D2 J3 100234 F1 D2 J3 100244 K2 JM F2 200788 K2 JM F2 200850 K2 JM F2 200690
期望结果:
engine id F1 D2 J3 100234 F1 D2 J3 100238 K2 JM F2 200788 K2 JM F2 200790 F1 D2 J3 100244 K2 JM F2 200850 K2 JM F2 200690
解决方案
方法1:合并后去重(最简单直接)
先将两个DataFrame纵向拼接,再删除重复行,保留首次出现的记录(即保留df1中的原有行):
import pandas as pd # 拼接两个DataFrame combined = pd.concat([df1, df2]) # 去重,按所有列判断,保留第一次出现的行 result = combined.drop_duplicates(keep='first').reset_index(drop=True)
方法2:先筛选df2中缺失的行再合并
如果数据量较大,这种方法更高效,避免拼接整个大表再去重:
方式A:用tuple和isin筛选
# 将每行转为元组,判断df2的行是否存在于df1中 mask = df2.apply(tuple, axis=1).isin(df1.apply(tuple, axis=1)) # 取出df2中不在df1的行 new_rows = df2[~mask] # 合并df1和新行 result = pd.concat([df1, new_rows]).reset_index(drop=True)
方式B:用merge的indicator参数筛选
# 左连接df2和df1,添加_merge列标记匹配情况 temp = df2.merge(df1, on=['engine', 'id'], how='left', indicator=True) # 筛选出仅在df2中存在的行,删除_merge列 new_rows = temp[temp['_merge'] == 'left_only'].drop('_merge', axis=1) # 合并得到结果 result = pd.concat([df1, new_rows]).reset_index(drop=True)
以上方法都能得到你需要的无重复扩展后的DataFrame。
内容的提问来源于stack exchange,提问作者detrraxic
相关产品推荐
相关产品推荐

