如何基于type、P_val及C_PP_val/C_val合并两个Pandas DataFrame?
问题解决方法
你的核心问题是单独用isin多列过滤时,只会检查每列元素是否各自存在,而不会验证三个列的组合是否同时匹配,导致不符合组合条件的行被错误保留。以下是两种可行的解决方法:
方法一:用组合元组集合过滤
先提取df1中type、P_val、C_PP_val的有效组合,再检查df2的对应组合是否在其中:
import pandas as pd # 从df1生成需要匹配的三元组集合(type, P_val, C_PP_val) match_combinations = set(df1[['type', 'P_val', 'C_PP_val']].itertuples(index=False, name=None)) # 过滤df2,仅保留三个列组合完全匹配的行 merged = df2[ df2[['type', 'P_val', 'C_val']].itertuples(index=False, name=None).isin(match_combinations) ] print(len(df1), len(df2), len(merged))
方法二:用Merge直接合并(更推荐)
既然你需要对比对应行的V_val和PP_val,直接用merge做内连接更高效,还能直接把两个DataFrame的对应列放在一起:
import pandas as pd # 先把df1的C_PP_val重命名为C_val,和df2的列名统一 df1_aligned = df1.rename(columns={'C_PP_val': 'C_val'}) # 基于type、P_val、C_val三个列做内连接,仅保留两边都存在的组合 merged = pd.merge(df1_aligned, df2, on=['type', 'P_val', 'C_val'], how='inner') # 此时merged中同时包含df1的PP_val和df2的V_val,可直接对比 print(len(df1), len(df2), len(merged))
原代码问题说明
你之前的代码df2.type.isin(df1.type) & df2.P_val.isin(df1.P_val)&df2.C_val.isin(df1.C_PP_val)是分别检查每个列的元素是否在df1对应列中,而非验证三者的组合是否同时存在。比如df2中某行的type在df1里、P_val在df1里、C_val也在df1的C_PP_val里,但这三个值的组合在df1中并不存在,这行依然会被保留,导致merged长度不符合预期。
内容的提问来源于stack exchange,提问作者Plant
相关产品推荐
相关产品推荐

