Excel 如何在python中获取索引值(多索引)

Excel 如何在python中获取索引值(多索引),excel,python-3.x,pandas,dataframe,comparison,Excel,Python 3.x,Pandas,Dataframe,Comparison,我正在创建一个工具,用于比较两个数据帧,并返回有关excel文件中差异的详细信息 带有差异的报告示例,其中TC表示包含差异的测试用例,fields列表示包含差异的字段名称: TC Fields Baseline New output 1 B 34 28 C 4 25 3 C 5 28 5 B 7 23 C

我正在创建一个工具,用于比较两个数据帧,并返回有关excel文件中差异的详细信息

带有差异的报告示例,其中TC表示包含差异的测试用例,fields列表示包含差异的字段名称:

TC  Fields  Baseline    New output
1   B         34           28
    C          4           25

3   C          5           28

5   B          7           23
    C          8           2
    D          6           24
基线文件(基线df):

新输出文件(新df):

例如,您可以在报告文件的字段列中看到,TC 5有3个字段存在差异,但如果您检查基线和新输出文件,您将看到这些差异实际上与文件中的TC 7相关

下面是代码示例:

def writeDetailsAboutDifferencesToNewExcelSheet(dfBaseline, dfNew):
    assert (dfBaseline.columns == dfNew.columns).all(), \
        "DataFrame column names are different"
    if dfBaseline.equals(dfNew):
        return None
    else:
        diff_mask = (dfBaseline != dfNew) & ~(dfBaseline.isnull() & dfNew.isnull())
        ne_stacked = diff_mask.stack()
        changed = ne_stacked[ne_stacked]
        changed.index.names = ['TC', 'Fields']
        difference_locations = np.where(diff_mask)
        changed_from = dfBaseline.values[difference_locations]
        changed_to = dfNew.values[difference_locations]
        df =  pd.DataFrame( {'Baseline': changed_from, 'New output': changed_to} , index=changed.index)
        return df
问题是它在报告中返回索引编号,而不是数据帧中相应索引的值,或者更好地说,我不知道如何返回包含差异的TC索引的值,以便具有差异的字段适合TC的编号,而不是其索引的编号


你能告诉我你是否知道如何解决这个问题吗?

我认为你的值TC1也错了。是的,但我以TC5为例,它对所有人都是一样的。如果你看一下报告中的TC 1,你会发现它实际上与TC2相关,这就是我想纠正的:)我相信它会发生,因为在TC列中,我返回索引值,而不是错误TC的值,索引从0开始,增量为1,而TC列的值可以是任意整数。
TC    A       B      C        D
1   22,00   27,00   24,00   25,00
2   23,00   28,00   25,00   27,00
3   24,00   2,00    27,00   28,00
5   25,00   2,00    28,00   2,00
6   27,00   22,00   2,00    2,00
7   28,00   23,00   2,00    24,00
9   2,00    24,00   24,00   25,00
10  2,00    25,00   25,00   2,00
def writeDetailsAboutDifferencesToNewExcelSheet(dfBaseline, dfNew):
    assert (dfBaseline.columns == dfNew.columns).all(), \
        "DataFrame column names are different"
    if dfBaseline.equals(dfNew):
        return None
    else:
        diff_mask = (dfBaseline != dfNew) & ~(dfBaseline.isnull() & dfNew.isnull())
        ne_stacked = diff_mask.stack()
        changed = ne_stacked[ne_stacked]
        changed.index.names = ['TC', 'Fields']
        difference_locations = np.where(diff_mask)
        changed_from = dfBaseline.values[difference_locations]
        changed_to = dfNew.values[difference_locations]
        df =  pd.DataFrame( {'Baseline': changed_from, 'New output': changed_to} , index=changed.index)
        return df