【问题标题】:Compare different df's row by row and return changes逐行比较不同的df并返回变化
【发布时间】:2021-11-02 09:51:50
【问题描述】:

我每个月都会收集包含要存储在我们数据库中的员工详细信息的数据。 我需要找到一种解决方案,将上个月存储的数据与收到的数据进行比较,并且对于任何列发生变化的每一行,它将返回到一个新的数据帧中。

我还需要以某种方式知道这个新返回的数据帧的每一行中的哪些列在发生这种比较时发生了变化。

还有一些重要的细节要提:

  • 每一列还可以在任何数据框中包含空白值;
  • 数据框具有相同的列名,但不一定具有相同的数据类型;
  • 数据帧的行数不一定相同;
  • 如果一行没有找到它的索引匹配,不要返回到新的数据框;
  • 数据帧的行可以通过名为“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             $7600       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 行索引更正了部门格式

进行这种比较的最佳方法是什么? 我不确定是否有一个简单的解决方案来理解每个字段的变化,但返回包含至少 1 次变化的行的数据框会有所帮助。

感谢您的支持!

【问题讨论】:

    标签: python pandas database dataframe compare


    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多