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

Pandas匹配两个DataFrame值异常:数值精度导致误匹配

解决DataFrame跨分组误匹配的问题

我来帮你搞定这个匹配问题!你的代码之所以会出现82.5和82.0误匹配的情况,核心问题是没有按Cntr No做分组匹配,而是全局检查整个列的数值,导致逻辑完全跑偏了。我们一步步来修复:

原代码的问题分析

你的代码里:

df['Tally'] = ((df_co['Cntr No'].isin(df['Cntr No'])) & ((df_co['Labour'].isin(df['Total'])) | (df_co['Material'].isin(df['Total'])) | (df_co['Amount'].isin(df['Total'])))).map({True:'Yes',False:'No'})

存在两个关键错误:

  • 全局检查而非分组匹配:df_co['Cntr No'].isin(df['Cntr No'])只是确认这个集装箱号在df中存在,但没有限定只匹配同一集装箱号下的Total值;同理,df_co['Amount'].isin(df['Total'])是检查整个df的Total列有没有这个值,而不是同一Cntr No下的Total。
  • 行数不兼容风险:直接把df_co的布尔结果赋值给df,一旦两个DataFrame行数不同,会触发广播机制,逻辑彻底混乱。

正确的解决方案

这里有两种靠谱的实现方式,都能精准按Cntr No分组匹配:

方法一:用分组构建有效值集合(简洁高效)

先为每个集装箱号收集df_co里所有需要匹配的数值(Labour、Material、Amount),再逐行检查df的Total是否在对应集合里:

# 为每个Cntr No整理出所有可匹配的数值列表
valid_values = df_co.groupby('Cntr No').apply(
    lambda group: group[['Labour', 'Material', 'Amount']].values.flatten()
).to_dict()

# 给df添加Tally列,判断当前Total是否在对应Cntr No的有效值里
df['Tally'] = df.apply(
    lambda row: 'Yes' if row['Total'] in valid_values.get(row['Cntr No'], []) else 'No',
    axis=1
)

用你的测试数据跑的话:

  • valid_values['BHCU 2604370'] 会是 [0.0, 82.5, 82.5, 24.0, 22.0, 46.0]
  • df第一行Total=82.0不在这个集合里,返回No;第二行Total=46.0在集合里,返回Yes,完全符合预期。

方法二:用合并(Merge)实现关联匹配(直观严谨)

如果需要更清晰的关联逻辑,可以把df_co转成长格式,再和df做精准合并:

# 将df_co的三列数值转成长格式,方便匹配
df_co_long = df_co.melt(
    id_vars='Cntr No',
    value_vars=['Labour', 'Material', 'Amount'],
    value_name='MatchValue'
)

# 按Cntr No + Total=MatchValue做左合并,找到匹配项
matched = df.merge(
    df_co_long,
    left_on=['Cntr No', 'Total'],
    right_on=['Cntr No', 'MatchValue'],
    how='left'
)

# 根据是否匹配到结果设置Tally
df['Tally'] = matched['MatchValue'].notna().map({True: 'Yes', False: 'No'})

这个方法能清晰看到每一行的匹配来源,适合处理更复杂的关联场景。

为什么原代码会误匹配?

举个例子,如果你的数据里还有另一个集装箱号ABCU 123456,它的Total值正好是82.5,那原代码里df_co['Amount'].isin(df['Total'])就会返回True,导致BHCU 2604370的行错误地被标记为Yes——这就是全局检查的坑!


内容的提问来源于stack exchange,提问作者okl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:24:41