逐行比较不同df的变化return
Compare different df's row by row and return changes
每个月我都会收集包含员工详细信息的数据,并将其存储在我们的数据库中。
我需要找到一个解决方案,将上个月存储的数据与收到的数据进行比较,对于任何列发生变化的每一行,它都会 return 到一个新的数据帧中。
我还需要以某种方式知道这个新 returned 数据框的每一行中的哪些列在进行这种比较时发生了变化。
还有一些重要的细节要提一下:
- 每列还可以包含任何数据框中的空白值;
- 数据帧具有相同的列名但不一定具有相同的数据类型;
- 数据帧不一定具有相同的行数;
- 如果一行没有找到它的索引匹配,不要return到新的数据框;
- 数据框的行可以与名为“Index”的列相匹配
所以,例如,我们会有这个数据框(它只是真实数据框的一部分,因为它有 63 列):
df1:
Index Department Salary Manager Email Start_Date
1 IT 6000.00 Jack ax@i.com 01-01-2021
2 HR 7000 O'Donnel ay@i.com
3 MKT 00 Maria d 30-06-2021
4 I'T 8000 Peter az@i.com 14-07-2021
df2:
Index Department Salary Manager Email Start_Date
1 IT 6000.00 Jack ax@i.com 01-01-2021
2 HR 7000 O'Donnel ay@i.com 01-01-2021
3 MKT 7600 Maria dy@i.com 30-06-2021
4 IT 8000 Peter az@i.com 14-07-2021
5 IT 9000 John NOT PROVIDED
6 IT 9900 John NOT PROVIDED
df3:
Index Department Salary Manager Email Start_Date
2 HR 7000 O'Donnel ay@i.com 01-01-2021
3 MKT 7600 Maria dy@i.com 30-06-2021
4 IT 8000 Peter az@i.com 14-07-2021
**本例中的区别是:
- 索引 2 行中添加的开始日期
- 行索引 3 的工资格式和电子邮件更正
- 行索引 4 的部门格式已更正
进行此比较的最佳方法是什么?
我不确定是否有一个简单的解决方案来理解每个字段中发生的变化,但是 return 使用至少有 1 个更改的行对数据框进行处理会有所帮助。
感谢支持!
我认为比较可以解决问题:https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.compare.html
但首先您需要通过索引对齐新旧数据帧之间的行:
new_df_to_compare=new_df.loc[old_df.index]
当数据类型不匹配时。您还需要对齐它们:
new_df_to_compare = new_df_to_compare.astype(old_df.dtypes.to_dict())
然后比较应该像这样工作:
difference_df = old_df.compare(new_df_to_compare)
每个月我都会收集包含员工详细信息的数据,并将其存储在我们的数据库中。 我需要找到一个解决方案,将上个月存储的数据与收到的数据进行比较,对于任何列发生变化的每一行,它都会 return 到一个新的数据帧中。
我还需要以某种方式知道这个新 returned 数据框的每一行中的哪些列在进行这种比较时发生了变化。
还有一些重要的细节要提一下:
- 每列还可以包含任何数据框中的空白值;
- 数据帧具有相同的列名但不一定具有相同的数据类型;
- 数据帧不一定具有相同的行数;
- 如果一行没有找到它的索引匹配,不要return到新的数据框;
- 数据框的行可以与名为“Index”的列相匹配
所以,例如,我们会有这个数据框(它只是真实数据框的一部分,因为它有 63 列):
df1:
Index Department Salary Manager Email Start_Date
1 IT 6000.00 Jack ax@i.com 01-01-2021
2 HR 7000 O'Donnel ay@i.com
3 MKT 00 Maria d 30-06-2021
4 I'T 8000 Peter az@i.com 14-07-2021
df2:
Index Department Salary Manager Email Start_Date
1 IT 6000.00 Jack ax@i.com 01-01-2021
2 HR 7000 O'Donnel ay@i.com 01-01-2021
3 MKT 7600 Maria dy@i.com 30-06-2021
4 IT 8000 Peter az@i.com 14-07-2021
5 IT 9000 John NOT PROVIDED
6 IT 9900 John NOT PROVIDED
df3:
Index Department Salary Manager Email Start_Date
2 HR 7000 O'Donnel ay@i.com 01-01-2021
3 MKT 7600 Maria dy@i.com 30-06-2021
4 IT 8000 Peter az@i.com 14-07-2021
**本例中的区别是:
- 索引 2 行中添加的开始日期
- 行索引 3 的工资格式和电子邮件更正
- 行索引 4 的部门格式已更正
进行此比较的最佳方法是什么? 我不确定是否有一个简单的解决方案来理解每个字段中发生的变化,但是 return 使用至少有 1 个更改的行对数据框进行处理会有所帮助。
感谢支持!
我认为比较可以解决问题:https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.compare.html
但首先您需要通过索引对齐新旧数据帧之间的行:
new_df_to_compare=new_df.loc[old_df.index]
当数据类型不匹配时。您还需要对齐它们:
new_df_to_compare = new_df_to_compare.astype(old_df.dtypes.to_dict())
然后比较应该像这样工作:
difference_df = old_df.compare(new_df_to_compare)