如何列出并对比两个DataFrame的列数据类型及找出不匹配列
DataFrame列数据类型对比与不匹配列排查
1. 按数据类型分组列出DataFrame的列(兼容geometry类型)
直接用df.dtypes作为分组键可能在遇到geometry等自定义类型时报错,将数据类型转为字符串后再分组即可解决:
# 处理df1,按数据类型分组列 df1_type_groups = df1.columns.to_series().groupby(df1.dtypes.astype(str)).groups print("=== df1 各数据类型对应列 ===") for dtype, cols in df1_type_groups.items(): print(f"{dtype}: {list(cols)}") # 同理处理df2 df2_type_groups = df2.columns.to_series().groupby(df2.dtypes.astype(str)).groups print("\n=== df2 各数据类型对应列 ===") for dtype, cols in df2_type_groups.items(): print(f"{dtype}: {list(cols)}")
2. 找出两DataFrame数据类型不匹配的列
由于两DataFrame列名完全匹配,直接遍历列名对比对应列的数据类型即可:
# 存储不匹配的列信息(列名、df1类型、df2类型) mismatched_cols = [] # 遍历所有列对比类型 for col in df1.columns: dtype_df1 = str(df1[col].dtype) dtype_df2 = str(df2[col].dtype) if dtype_df1 != dtype_df2: mismatched_cols.append((col, dtype_df1, dtype_df2)) # 输出结果 print("\n=== 数据类型不匹配的列 ===") for col, dt1, dt2 in mismatched_cols: print(f"列 {col}: df1 类型为 {dt1},df2 类型为 {dt2}")
完整示例(针对你的场景)
import pandas as pd from shapely.geometry import Point import geopandas as gpd # 构造示例df1 data1 = { 'Geometry': [Point(1,2), Point(3,4)], 'A': [1, 2], 'B': ['x', 'y'] } df1 = gpd.GeoDataFrame(data1, geometry='Geometry') # 构造示例df2(A列为字符串类型,与df1不匹配) data2 = { 'Geometry': [Point(5,6), Point(7,8)], 'A': ['1', '2'], 'B': ['x', 'y'] } df2 = gpd.GeoDataFrame(data2, geometry='Geometry') # 按类型分组列 df1_type_groups = df1.columns.to_series().groupby(df1.dtypes.astype(str)).groups print("=== df1 各数据类型对应列 ===") for dtype, cols in df1_type_groups.items(): print(f"{dtype}: {list(cols)}") df2_type_groups = df2.columns.to_series().groupby(df2.dtypes.astype(str)).groups print("\n=== df2 各数据类型对应列 ===") for dtype, cols in df2_type_groups.items(): print(f"{dtype}: {list(cols)}") # 查找不匹配列 mismatched_cols = [] for col in df1.columns: dt1 = str(df1[col].dtype) dt2 = str(df2[col].dtype) if dt1 != dt2: mismatched_cols.append((col, dt1, dt2)) print("\n=== 数据类型不匹配的列 ===") for col, dt1, dt2 in mismatched_cols: print(f"列 {col}: df1 类型为 {dt1},df2 类型为 {dt2}")
运行结果
=== df1 各数据类型对应列 === geometry: ['Geometry'] int64: ['A'] object: ['B'] === df2 各数据类型对应列 === geometry: ['Geometry'] object: ['A', 'B'] === 数据类型不匹配的列 === 列 A: df1 类型为 int64,df2 类型为 object
内容的提问来源于stack exchange,提问作者ashnaa1610
相关产品推荐
相关产品推荐

