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

基于ID索引的两个Pandas DataFrame逐行对比问题求助

DataFrame逐行对比差异时ValueError的解决方法

问题描述

我有两个列名相同的CSV文件,已将ID列设置为两个DataFrame的索引,需要逐行对比差异并将结果写入CSV文件。但尝试的三种对比逻辑均触发ValueError错误:

ValueError: The truth value of a series is ambiguous, Use a.empty, a.bool(), a.item(), a.any() or a.all()

示例数据

import pandas as pd

data1 = {
    'ID': [100, 21, 32, 42, 51, 81],
    'Name': ['A', 'B', 'C', 'D','E','F'],
    'State': ['TX', 'FL', 'FL', 'CA', 'CA', 'TX']
}
data2 = {
    'ID': [100, 21, 32, 42, 51, 81],
    'Name': ['A', 'BB', 'C', 'DD','E','F'],  # 第2、4行存在差异
    'State': ['TX', 'TX', 'FL', 'CA', 'CA', 'TX']
}

df1 = pd.DataFrame(data1).set_index('ID')
df2 = pd.DataFrame(data2).set_index('ID')

期望输出

捕获两行数据的差异,例如:

索引ID: 21,差异:Name: B <> BB,State: FL <> TX
索引ID: 42,差异:Name: D <> DD,State: CA <> CA

错误原因

触发错误的核心原因是:直接在if语句中使用Series的布尔对比(如if df1.loc[idx] != df2.loc[idx])会返回一个布尔值Series,而Python无法直接判断整个Series的真值,因此抛出歧义错误。必须用.any()/.all()将Series转换为单一布尔值后再做判断。

修正后的代码

import pandas as pd

# 示例数据初始化
data1 = {
    'ID': [100, 21, 32, 42, 51, 81],
    'Name': ['A', 'B', 'C', 'D','E','F'],
    'State': ['TX', 'FL', 'FL', 'CA', 'CA', 'TX']
}
data2 = {
    'ID': [100, 21, 32, 42, 51, 81],
    'Name': ['A', 'BB', 'C', 'DD','E','F'],
    'State': ['TX', 'TX', 'FL', 'CA', 'CA', 'TX']
}

df1 = pd.DataFrame(data1).set_index('ID')
df2 = pd.DataFrame(data2).set_index('ID')

# 存储差异结果的列表
diff_records = []

# 遍历每个索引ID逐行对比
for idx in df1.index:
    row1 = df1.loc[idx]
    row2 = df2.loc[idx]
    
    # 判断当前行是否存在差异(用.any()避免真值歧义)
    if (row1 != row2).any():
        diff_details = []
        # 逐列对比收集差异
        for col in df1.columns:
            if row1[col] != row2[col]:
                diff_details.append(f"{col}: {row1[col]} <> {row2[col]}")
        # 整理成结构化数据,方便写入CSV
        diff_records.append({
            'ID': idx,
            '差异详情': f"索引ID: {idx},差异:{', '.join(diff_details)}"
        })

# 将差异结果写入CSV文件
pd.DataFrame(diff_records).to_csv('data_diff.csv', index=False, encoding='utf-8-sig')

# 打印结果验证
for record in diff_records:
    print(record['差异详情'])

代码说明

  • 用(row1 != row2).any()判断当前行是否存在差异,返回单一布尔值,避免真值歧义
  • 逐列对比差异并整理成清晰的描述文本
  • 将差异结果存储为结构化DataFrame,方便写入CSV文件,同时支持直接打印查看

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 15:53:17