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

合并两个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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:59:49