如何在使用df.compare()时显示行名而不是索引号?

0 投票
1 回答
32 浏览
提问于 2025-04-14 16:50

我正在使用 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

撰写回答