如何用Pandas对比Excel与JSON文件?适用命令有哪些?
使用Pandas对比Excel与JSON文件的方法及实用命令
数据示例
1. Excel文件内容
| ID | Price | Status |
|---|---|---|
| 1 | 1000 | Free |
| 2 | 2000 | Option |
| 3 | 3000 | Reserved |
2. JSON文件内容
注意:该JSON为多行独立JSON对象(非标准JSON数组),需用特殊方式加载:
{ "id": 1, "price": "1000", "status": "free" } { "id": 2, "localization": "2000", "reference": "Option" } { "id": 3, "localization": "3000", "reference": "Reserved" }
对比步骤及实用命令
1. 加载文件到Pandas DataFrame
加载Excel文件
直接用pd.read_excel()读取,同时统一列名格式:
import pandas as pd # 加载Excel文件 df_excel = pd.read_excel("your_excel_file.xlsx") # 列名转小写,和JSON字段格式对齐 df_excel.columns = df_excel.columns.str.lower()
加载多行JSON文件
利用lines=True参数读取多行独立JSON对象,再统一字段名:
# 加载多行JSON df_json = pd.read_json("your_json_file.json", lines=True) # 重命名不一致的字段,和Excel列名对齐 df_json = df_json.rename(columns={ "localization": "price", "reference": "status" })
2. 统一数据类型与格式
JSON中price是字符串、status大小写不一致,需和Excel数据对齐:
# 将JSON的price转为整数类型 df_json["price"] = df_json["price"].astype(int) # 统一status字段的大小写格式 df_json["status"] = df_json["status"].str.capitalize()
3. 执行数据对比
方法1:合并后标记匹配状态
通过id关联两个DataFrame,标记每行在两个文件中的存在情况:
# 全量合并两个DataFrame,保留所有行 merged_df = pd.merge( df_excel, df_json, on="id", how="outer", suffixes=("_excel", "_json"), indicator=True ) # 筛选出仅存在于单个文件的差异行 diff_rows = merged_df[merged_df["_merge"] != "both"] print(diff_rows)
方法2:快速判断整体一致性
如果两个DataFrame的结构、数据完全一致,equals()会返回True:
# 确保两个DataFrame的列顺序一致 df_excel = df_excel[["id", "price", "status"]] df_json = df_json[["id", "price", "status"]] # 判断整体是否一致 print(df_excel.equals(df_json))
方法3:逐单元格展示差异
用compare()直接输出两个DataFrame的单元格级差异:
# 先按id排序,确保行顺序完全对齐 df_excel_sorted = df_excel.sort_values("id").reset_index(drop=True) df_json_sorted = df_json.sort_values("id").reset_index(drop=True) # 输出详细差异 diff_details = df_excel_sorted.compare(df_json_sorted) print(diff_details)
4. 核心实用命令汇总
- 文件加载:
pd.read_excel()、pd.read_json(lines=True)(处理多行JSON) - 字段对齐:
df.rename()(重命名列)、df.columns.str.lower()(统一列名格式) - 数据格式化:
df["col"].astype()(类型转换)、df["col"].str.capitalize()(字符串格式统一) - 合并对比:
pd.merge(..., indicator=True)(标记行的匹配状态) - 直接对比:
df.equals()(整体一致性判断)、df.compare()(单元格级差异展示) - 排序对齐:
df.sort_values()、df.reset_index(drop=True)(确保行顺序一致)
内容的提问来源于stack exchange,提问作者SiemowitJarilo
相关产品推荐
相关产品推荐

