比较数据框架并使用Python获得差异

时间:2019-05-06 13:12:50

标签: python-3.x pandas

我有两个数据帧,如下所示。根据资源,我们在哪里有项目时间。 一个是大约10天前的信息,另一个是今天的信息。 我只想找到这两个数据帧之间的差异(执行差异时要同时考虑资源和项目)。例如,对于PN8,Mat以前有8,但现在为16,因此结果应为PN13--Mat--8。 PN22是全新的,因此,它应该与新的Daataframe(PN22--Sid--2)完全一样。以前但现在有一些资源(例如Raja)。有些资源以前不存在,但现在已经存在(如安)。这两个都应该在新的数据框中。

我尝试进行直接比较df1 != df2,但是我得到一个错误,即使标签完全相同,标签也不同。你能帮忙吗?

enter image description here  enter image description here

1 个答案:

答案 0 :(得分:0)

要比较和计算差异,首先将数据框的索引设置为 PR No.Resource 列。使用 append 组合数据框。然后,按索引(PR No.Resource 的组合)分组并计算每个组内的差异。这将在包含两个值的组中生成 NaN,因此不需要它们,dropna 函数会处理这个问题。最后,调用 reset_indexPR No.Resource 作为列返回。

# setup
data1 = [
    ["PN1", "Chris", 1],
    ["PN2", "Julie", 80],
    ["PN3", "John", 2.4],
    ["PN4", "Steve", 2]
]

data2 = [
    ["PN1", "Chris", 11],
    ["PN2", "Julie", 76],
    ["PN8", "John", 2.4],
    ["PN9", "Jonas", 2]
]

df1 = pd.DataFrame(data1, columns = ["PR No.", "Resource", "hours"])
df2 = pd.DataFrame(data2, columns = ["PR No.", "Resource", "hours"])

print(df1)
print(df2)

# solution
group_by_cols = ["PR No.", "Resource"]
indexed_by_group_cols_1 = df1.set_index(group_by_cols)
indexed_by_group_cols_2 = df2.set_index(group_by_cols)
appended = indexed_by_group_cols_1.append(indexed_by_group_cols_2)
grouped_by_index = appended.groupby(appended.index)

compare_diff = grouped_by_index.apply(lambda x: x.diff() if len(x) > 1 else x) \
    .dropna().reset_index()

print(compare_diff)

输出:

DF1:

  PR No. resource  hours
0    PN1    Chris    1.0
1    PN2    Julie   80.0
2    PN3     John    2.4
3    PN4    Steve    2.0

DF2:

  PR No. resource  hours
0    PN1    Chris   11.0
1    PN2    Julie   76.0
2    PN8     John    2.4
3    PN9    Jonas    2.0

结果:

  PR No. resource  hours
0    PN1    Chris   10.0
1    PN2    Julie   -4.0
2    PN3     John    2.4
3    PN4    Steve    2.0
4    PN8     John    2.4
5    PN9    Jonas    2.0