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

时间:2017-09-05 09:24:19

标签: excel python-3.x pandas dataframe comparison

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

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

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):

TC   A        B       C       D
1   22,00   27,00   24,00   25,00
2   23,00   34,00   4,00    27,00
3   24,00   2,00    27,00   28,00
5   25,00   2,00    5,00    2,00
6   27,00   22,00   2,00    2,00
7   28,00   7,00    8,00    6,00
9   2,00    24,00   24,00   25,00
10  2,00    25,00   25,00   2,00

新输出文件(新df):

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

正如您在报告文件的“字段”列中看到的那样,有3个字段存在差异,如TC 5所示,但如果检查基线和新输出文件,您将看到这些差异与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的数量而不是其索引的数量?

如果您对如何解决这个问题有什么想法,请告诉我吗?

0 个答案:

没有答案