合并两个DataFrame时如何处理Token顺序匹配以保留关联信息
解决DataFrame合并时Token顺序不匹配的问题
你遇到的问题很典型——df2里存在token和token2顺序反转的记录(比如sent=1的k g对应df1里的g k),而默认的merge只会严格匹配列顺序完全一致的组合,导致g k这条记录无法匹配到对应的rel=C值。
不需要创建df1的副本,我们可以通过同时匹配正向和反向的Token组合来解决这个问题,具体有两种简洁的实现方式:
方法一:两次合并+填充NaN
这种方式先做正向匹配,再做反向匹配,最后用反向匹配的结果填充正向匹配的空值,全程不需要复制df1:
# 第一步:正向匹配(原顺序) df_new = df1.merge(df2, on=["sent", "token", "token2"], how="left") # 第二步:反向匹配(交换token和token2的顺序) reverse_match = df1.merge( df2, left_on=["sent", "token", "token2"], right_on=["sent", "token2", "token"], how="left", suffixes=("", "_reverse") ) # 第三步:用反向匹配的rel值填充正向匹配的空值 df_new["rel"] = df_new["rel"].fillna(reverse_match["rel_reverse"])
运行后你就能得到想要的df_new,其中sent=1的g k会正确匹配到rel=C。
方法二:预处理df2再合并
我们可以临时生成一个包含两种Token顺序的df2扩展版(不修改原df2),然后和df1做一次合并:
import pandas as pd # 生成df2的反向版本(交换token和token2) df2_reversed = df2.rename(columns={"token": "token2", "token2": "token"}) # 合并原df2和反向版本,得到包含两种顺序的临时表 df2_combined = pd.concat([df2, df2_reversed], ignore_index=True) # 和df1做left merge df_new = df1.merge(df2_combined, on=["sent", "token", "token2"], how="left")
这种方式更直观,而且同样不会创建df1的副本,只是临时处理了df2的结构。
两种方法都能解决你的问题,你可以根据数据量大小选择:如果df2数据量很大,方法一的两次合并效率更高;如果数据量小,方法二的可读性更好。
内容的提问来源于stack exchange,提问作者Mi.
相关产品推荐
相关产品推荐

