如何用Pandas打印Excel单元格值及获取DataFrame不匹配单元格位置
问题1:如何使用Pandas打印Excel中的单元格值
- 先安装依赖:读取
.xlsx文件需要openpyxl,读取.xls需安装xlrd(注意xlrd 2.0及以上版本不再支持.xls,若需读取这类文件请安装xlrd<2.0) - 读取Excel文件到DataFrame:
import pandas as pd # 读取指定工作表,默认读取第一个工作表 df = pd.read_excel("your_excel_file.xlsx", sheet_name="Sheet1")
- 打印指定单元格值的常用方式:
- 通过行索引+列名定位(可读性高,推荐):
# 打印索引为1的行、列名为"name"的单元格值 print(df.at[1, "name"]) - 通过行/列的位置序号定位(从0开始计数):
# 打印第2行(位置序号1)、第1列(位置序号0)的单元格值 print(df.iat[1, 0]) - 也可使用
loc(标签索引)或iloc(位置索引):print(df.loc[1, "name"]) # 效果同at print(df.iloc[1, 0]) # 效果同iat
- 通过行索引+列名定位(可读性高,推荐):
问题2:获取两个DataFrame不匹配值的单元格位置
你的现有代码仅能筛选出存在不匹配的行,要定位具体不匹配的单元格,可参考以下两种实现方式:
方式1:生成不匹配单元格明细列表
import pandas as pd # 读取两个CSV文件(沿用你的代码逻辑) file = ["random1.csv", "random2.csv"] li = [] for filename in file: df = pd.read_csv(filename, index_col=None, header=0) li.append(df) df1, df2 = li[0], li[1] # 生成布尔矩阵:True表示对应位置的值不匹配 mismatch_mask = df1.ne(df2) # 遍历提取所有不匹配的单元格信息 mismatch_details = [] for row_idx in mismatch_mask.index: for col_name in mismatch_mask.columns: if mismatch_mask.loc[row_idx, col_name]: mismatch_details.append({ "行索引": row_idx, "列名": col_name, f"{file[0]}值": df1.loc[row_idx, col_name], f"{file[1]}值": df2.loc[row_idx, col_name] }) # 打印结果 print("不匹配单元格明细:") for detail in mismatch_details: print(f"行{detail['行索引']} 列{detail['列名']}: {file[0]}={detail[f'{file[0]}值']}, {file[1]}={detail[f'{file[1]}值']}")
方式2:用stack()快速整理结果(更简洁)
利用pandas的stack功能快速汇总不匹配位置:
# 生成不匹配的Series,索引为(行索引, 列名) mismatch_series = mismatch_mask.stack()[mismatch_mask.stack()] # 输出每个不匹配位置的信息 print("\n不匹配位置汇总:") for (row_idx, col_name), _ in mismatch_series.items(): print(f"位置:行{row_idx},列{col_name}") print(f"{file[0]}值:{df1.loc[row_idx, col_name]},{file[1]}值:{df2.loc[row_idx, col_name]}\n")
针对你的示例数据,运行后会输出类似内容:
不匹配单元格明细: 行1 列address: random1.csv=1, random2.csv=2 行4 列address: random1.csv=2, random2.csv=3 行9 列address: random1.csv=11, random2.csv=10
内容的提问来源于stack exchange,提问作者karthick HARI
相关产品推荐
相关产品推荐

