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
相关产品推荐
相关产品推荐

