如何在使用df.compare()时显示行名而不是索引号?
我正在使用 df.compare 来比较两个有相同索引/行名称的 CSV 文件。当我进行比较时,它能如预期那样显示差异,但它给出的行索引是 0、2、5 等等,也就是在 CSV 文件中找到差异的地方。我希望的是,能显示出差异的行文本,而不是这些行号。
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={})
来替换列名,但我该如何把 0、2、3、4 替换成文本名称呢?
1 个回答
0
你需要做的就是把索引设置为你想在输出中显示行索引标签的那一列。
import pandas as pd # 1.5.3
df1 = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie', 'Dana', 'Edward', 'Favin'],
'number1': [1, 2, 3, 4, 5, 6],
'number2': [1, 2, 3, 4, 5, 6],
})
# print(df1)
# name number1 number2
# 0 Alice 1 1
# 1 Bob 2 2
# 2 Charlie 3 3
# 3 Dana 4 4
# 4 Edward 5 5
# 5 Favin 6 6
df2 = df1.assign(
number1=[1, 2, -1, -1, 5, 6],
number2=[1, -1, -1, 4, 5, -1],
)
# print(df2)
# name number1 number2
# 0 Alice 1 1
# 1 Bob 2 -1
# 2 Charlie -1 -1
# 3 Dana -1 4
# 4 Edward 5 5
# 5 Favin 6 -1
# ① set the index
df1 = df1.set_index('name')
df2 = df2.set_index('name')
# ② compare (use result_names=…) to avoid needing to use (.rename(…))
print(
df1.compare(df2, result_names=('old', 'latest'))
)
# number1 number2
# old latest old latest
# name
# Bob NaN NaN 2.0 -1.0
# Charlie 3.0 -1.0 3.0 -1.0
# Dana 4.0 -1.0 NaN NaN
# Favin NaN NaN 6.0 -1.0