我有两个数据帧,如下所示。根据资源,我们在哪里有项目时间。 一个是大约10天前的信息,另一个是今天的信息。 我只想找到这两个数据帧之间的差异(执行差异时要同时考虑资源和项目)。例如,对于PN8,Mat以前有8,但现在为16,因此结果应为PN13--Mat--8。 PN22是全新的,因此,它应该与新的Daataframe(PN22--Sid--2)完全一样。以前但现在有一些资源(例如Raja)。有些资源以前不存在,但现在已经存在(如安)。这两个都应该在新的数据框中。
我尝试进行直接比较df1 != df2
,但是我得到一个错误,即使标签完全相同,标签也不同。你能帮忙吗?
答案 0 :(得分:0)
要比较和计算差异,首先将数据框的索引设置为 PR No.
和 Resource
列。使用 append
组合数据框。然后,按索引(PR No.
和 Resource
的组合)分组并计算每个组内的差异。这将在包含两个值的组中生成 NaN,因此不需要它们,dropna
函数会处理这个问题。最后,调用 reset_index
将 PR 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