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

Pandas:如何比较两个DataFrame的行并存储对应值?

实现两个Pandas DataFrame的行比较与结果存储

我来帮你梳理一下怎么完成这个需求,咱们一步步拆解操作:

1. 先明确数据结构与匹配规则

首先得对齐两个DataFrame的行——因为它们的ID列数量不一样(单行DF是前5列ID,多行DF是前3列ID),你需要先确定哪些ID字段是用来匹配对应行的。比如是单行DF的前3列对应多行DF的前3列?还是单行DF的某一列和多行DF的某一列匹配?这里我先以「单行DF的第一列ID和多行DF的第一列ID匹配」为例,你可以根据实际业务规则调整。

先模拟示例数据方便演示:

import pandas as pd

# 模拟仅含一行的DataFrame(前5列ID,后续为数据列)
df_single = pd.DataFrame(
    [[0, 1, 865694, 'C', 'T'] + [0]*20],
    columns=[f"ID{i}" for i in range(1,6)] + [f"data{i}" for i in range(1,21)]
)

# 模拟多行DataFrame(前3列ID,后续为数据列)
multi_data_rows = [
    [0, 'G', 'C'] + [3]*18 + [1, 3],
    [1, 'T', 'G'] + [0]*20,
    [2, 'G', 'A'] + [3,2] + [3]*6 + [2,1,1,1,2,0,3,3],
    [3, 'A', 'G'] + [3]*18 + [1,3],
    [4, 'C', 'T'] + [0]*20
]
df_multi = pd.DataFrame(
    multi_data_rows,
    columns=[f"ID_{i}" for i in range(1,4)] + [f"data{i}" for i in range(1,21)]
)

2. 筛选出需要比较的对应行

根据你确定的ID匹配规则,从多行DF里筛选出和单行DF对应的行:

# 示例规则:单行DF的ID1 等于 多行DF的ID_1
matched_row = df_multi[df_multi['ID_1'] == df_single['ID1'].iloc[0]]

# 如果是多列匹配(比如单行ID1/ID2/ID3对应多行ID_1/ID_2/ID_3),可以这么写:
# matched_row = df_multi[
#     (df_multi['ID_1'] == df_single['ID1'].iloc[0]) &
#     (df_multi['ID_2'] == df_single['ID2'].iloc[0]) &
#     (df_multi['ID_3'] == df_single['ID3'].iloc[0])
# ]

3. 提取数据列并执行比较

接下来把两个DF的非ID数据列提取出来,进行逐元素比较,你可以根据需求选择不同的比较方式:

方式1:判断对应值是否相等

# 提取数据列(筛选列名以data开头的列)
single_data_cols = df_single.filter(regex="^data")
multi_data_cols = matched_row.filter(regex="^data")

# 逐元素比较,生成布尔结果(相等为True,不等为False)
equality_result = single_data_cols.eq(multi_data_cols)

方式2:存储对应值+比较结果(更直观)

如果需要把两个DF的对应值、是否相等甚至差值都存下来,可以生成一个结果DF:

# 把数据列转成一维数组方便拼接
single_vals = single_data_cols.values.flatten()
multi_vals = multi_data_cols.values.flatten()

# 构建结果DataFrame
comparison_df = pd.DataFrame({
    "data_column": single_data_cols.columns,
    "single_df_value": single_vals,
    "multi_df_value": multi_vals,
    "values_are_equal": single_vals == multi_vals,
    "value_difference": single_vals - multi_vals  # 仅数值类型适用,字符串的话可以注释掉
})

4. 存储比较结果

最后把结果保存成你需要的格式,比如CSV或Excel:

# 保存为CSV文件
comparison_df.to_csv("df_comparison_result.csv", index=False)

# 保存为Excel文件(需要先安装openpyxl库:pip install openpyxl)
comparison_df.to_excel("df_comparison_result.xlsx", index=False, engine="openpyxl")

额外提示

  • 如果多行DF中有多个匹配行,上面的代码会保留所有匹配行进行比较,你可以用.iloc[0]只取第一行,或者循环处理每一行。
  • 如果数据列的列名不完全一致,你需要先对齐列名(比如重命名列,或者按位置提取数据列,比如df_single.iloc[:,5:]提取单行DF第5列之后的所有数据列)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:54:24