使用Pandas df.compare()时如何显示行名称而非索引序号?
问题
使用Pandas的df.compare()对比两个行名称/索引完全相同的CSV文件时,能正常显示数据差异,但结果里的行仅显示数字索引(如0、2、3、4),希望将这些数字索引替换为对应的行文本名称。
当前使用的代码:
diff_out_csv = old.compare(latest, align_axis=1).rename(columns={'self':'old','other':'latest'})
当前输出:
NUMBER1 NUMBER2 NUMBER3 old latest old latest old latest 0 -14.1685 -14.0132 -1.2583 -1.2611 NaN NaN 2 -9.7875 -12.2739 -0.3532 -0.3541 86.0 100.0 3 -0.0365 -0.0071 -0.0099 -0.0039 6.0 2.0 4 -1.9459 -1.5258 -0.5402 -0.0492 73.0 131.0
期望输出:
NUMBER1 NUMBER2 NUMBER3 old latest old latest old latest JACK -14.1685 -14.0132 -1.2583 -1.2611 NaN NaN JASON -9.7875 -12.2739 -0.3532 -0.3541 86.0 100.0 JACOB -0.0365 -0.0071 -0.0099 -0.0039 6.0 2.0 JIMMY -1.9459 -1.5258 -0.5402 -0.0492 73.0 131.0
已通过df.compare.rename(columns={})修改了列名,但不知道如何替换数字索引为文本名称。
解决方案
df.compare()返回的结果默认保留的是原DataFrame的位置索引(数字),直接从原DataFrame(old或latest,两者索引一致)中提取对应位置的文本索引标签,赋值给结果的索引即可。
修改后的代码:
# 生成对比结果 diff_out_csv = old.compare(latest, align_axis=1).rename(columns={'self':'old','other':'latest'}) # 将结果的数字索引替换为原DataFrame的文本索引 diff_out_csv.index = old.index[diff_out_csv.index]
或者合并为一行代码:
diff_out_csv = old.compare(latest, align_axis=1).rename(columns={'self':'old','other':'latest'}).set_index(old.index[old.compare(latest, align_axis=1).index])
原理说明
old.index是原DataFrame的完整文本索引列表(如['JACK', 'xxx', 'JASON', ...])diff_out_csv.index是对比结果返回的数字位置索引(如[0,2,3,4])- 通过
old.index[diff_out_csv.index]可精准提取对应位置的文本索引,替换掉结果里的数字索引
内容的提问来源于stack exchange,提问作者JNC
相关产品推荐
相关产品推荐

