如何在Pandas中筛选两行比较结果的False值并迭代处理?
解决两个同结构DataFrame的逐行差异提取问题
方法一:Pandas矢量化操作(高效推荐)
无需逐行循环,直接利用Pandas批量处理能力,先统一处理空值,生成差异掩码后提取差异值,数据量越大效率优势越明显。
完整代码
import pandas as pd # 示例数据 df1 = pd.DataFrame({'Name': ['Adam','Sara','John'], 'Age': [22, 25, 20], 'City':['New York','',None]}) df2 = pd.DataFrame({'Name': ['Adam','Sara','John'], 'Age': [22, 19, 20], 'City':['New York',None,'New Mexico']}) # 统一填充空值,避免None与空字符串的比较误差 df1_filled = df1.fillna('') df2_filled = df2.fillna('') # 生成差异掩码:True表示对应位置的值不同 diff_mask = df1_filled != df2_filled # 提取所有差异信息并整理成DataFrame diff_records = [] for row_idx, col_mask in diff_mask.iterrows(): # 获取当前行存在差异的列名 diff_columns = col_mask[col_mask].index for col in diff_columns: diff_records.append({ '行索引': row_idx, '列名': col, 'df1值': df1.loc[row_idx, col], 'df2值': df2.loc[row_idx, col] }) # 输出整理后的差异结果 diff_result_df = pd.DataFrame(diff_records) print(diff_result_df)
输出结果
行索引 列名 df1值 df2值 0 1 Age 25 19 1 2 City None New Mexico
方法二:逐行循环实现(按需求定制)
如果坚持要逐行遍历处理,可以在循环内筛选出差异项:
完整代码
import pandas as pd df1 = pd.DataFrame({'Name': ['Adam','Sara','John'], 'Age': [22, 25, 20], 'City':['New York','',None]}) df2 = pd.DataFrame({'Name': ['Adam','Sara','John'], 'Age': [22, 19, 20], 'City':['New York',None,'New Mexico']}) # 逐行遍历所有行 for i in range(df1.shape[0]): # 逐行比较,得到布尔结果(True表示值相同,False表示不同) row_compare = df1.loc[i].fillna('') == df2.loc[i].fillna('') # 筛选出结果为False的列(即差异列) diff_cols = row_compare[row_compare == False].index if len(diff_cols) > 0: print(f"第{i}行差异:") for col in diff_cols: print(f" {col}: df1={df1.loc[i, col]}, df2={df2.loc[i, col]}")
输出结果
第1行差异: Age: df1=25, df2=19 第2行差异: City: df1=None, df2=New Mexico
关键说明
- 统一填充空值是为了避免
None和空字符串''被误判为不同,若需要区分这两种空值,可去掉fillna('')操作。 - 矢量化操作是Pandas的核心优势,优先推荐方法一。
内容的提问来源于stack exchange,提问作者Mohamed Mostafa El-Sayyad
相关产品推荐
相关产品推荐

