如何比较含文本、数值及None值且类型不同的两个Pandas DataFrame
解决混合类型DataFrame的相等性检查问题
针对同时包含文本、数值(整数/浮点数)及空值的两个DataFrame,可通过以下两种高效方法判断数据是否一致:
方法一:分类型矢量化比较(推荐,适合大数据量)
该方法将数值列和非数值列分开处理,兼顾类型兼容性和空值判断:
import pandas as pd import numpy as np # 1. 分离数值列与非数值列 non_numeric_cols = df1.select_dtypes(exclude=['number']).columns numeric_cols = df1.select_dtypes(include=['number']).columns # 2. 检查非数值列:直接比较值,空值视为相等 non_num_match = ((df1[non_numeric_cols] == df2[non_numeric_cols]) | (df1[non_numeric_cols].isna() & df2[non_numeric_cols].isna())).all().all() # 3. 检查数值列:允许整数与对应浮点数相等,空值视为相等 num_match = (np.isclose(df1[numeric_cols], df2[numeric_cols], equal_nan=True)).all().all() # 4. 整体结果:两部分都匹配则数据一致 is_same = non_num_match and num_match
方法二:自定义元素级比较(适合小数据量,逻辑直观)
通过遍历每个元素,自定义相等判断规则:
import pandas as pd def check_dataframe_equal(df_a, df_b): # 先检查形状是否一致 if df_a.shape != df_b.shape: return False for col in df_a.columns: for idx in df_a.index: val_a = df_a.loc[idx, col] val_b = df_b.loc[idx, col] # 空值(None/NaN)视为相等 if pd.isna(val_a) and pd.isna(val_b): continue # 整数与对应浮点数(如5和5.0)视为相等 if isinstance(val_a, int) and isinstance(val_b, float): if not (val_a == val_b and val_b.is_integer()): return False elif isinstance(val_a, float) and isinstance(val_b, int): if not (val_b == val_a and val_a.is_integer()): return False # 其他类型直接比较值 elif val_a != val_b: return False return True is_same = check_dataframe_equal(df1, df2)
关键说明
- 两种方法都默认列名和索引完全一致,如果列名/索引顺序不同,需先对齐(如
df2 = df2.reindex_like(df1))。 np.isclose自动处理整数与浮点数的数值相等判断,equal_nan=True确保NaN/None被视为相等。
内容的提问来源于stack exchange,提问作者Pro Q
相关产品推荐
相关产品推荐

