每個月我都會收集包含要存盤在我們資料庫中的員工詳細資訊的資料。我需要找到一個解決方案來將上個月存盤的資料與收到的資料進行比較,并且對于任何列發生更改的每一行,它都會回傳到一個新的資料幀中。
當這種比較發生時,我還需要以某種方式知道這個新回傳的資料幀的每一行中的哪些列發生了變化。
還有一些重要的細節需要提及:
- 每列也可以在任何資料框中包含空白值;
- 資料框具有相同的列名,但不一定具有相同的資料型別;
- 資料幀不一定具有相同的行數;
- 如果一行沒有找到它的索引匹配,不要回傳到新的資料幀;
- 資料框的行可以通過名為“Index”的列匹配
因此,例如,我們會有這個資料幀(它只是真實資料幀的一部分,因為它有 63 列):
df1:
Index Department Salary Manager Email Start_Date
1 IT 6000.00 Jack [email protected] 01-01-2021
2 HR 7000 O'Donnel [email protected]
3 MKT $7600 Maria d 30-06-2021
4 I'T 8000 Peter [email protected] 14-07-2021
df2:
Index Department Salary Manager Email Start_Date
1 IT 6000.00 Jack [email protected] 01-01-2021
2 HR 7000 O'Donnel [email protected] 01-01-2021
3 MKT 7600 Maria [email protected] 30-06-2021
4 IT 8000 Peter [email protected] 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 [email protected] 01-01-2021
3 MKT 7600 Maria [email protected] 30-06-2021
4 IT 8000 Peter [email protected] 14-07-2021
**本例的不同之處在于:
- 在索引 2 的行中添加開始日期
- 更正了第 3 行的工資格式和電子郵件
- 針對行索引 4 更正部門格式
進行這種比較的最佳方法是什么?我不確定是否有一個簡單的解決方案來理解每個欄位中的變化,但回傳包含至少 1 個更改的行的資料框會有所幫助。
謝謝你的支持!
uj5u.com熱心網友回復:
我認為比較可以解決問題: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)
uj5u.com熱心網友回復:
有一個相當緊湊的解決方案:
df1.iloc[df2.index[df2.index.isin(df1.index)]].compare(df2)
但是,也許您希望獲得不同的輸出。
df1.iloc[df1.iloc[df2.index[df2.index.isin(df1.index)]].compare(df2).index]
這正是您想要的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/345921.html
上一篇:GROUPBY所有列?
