簡體   English   中英

比較具有不同列的兩個數據框並獲得差異

[英]Comparing two data frames with different columns and getting the differences

我有一個與此處類似的問題比較兩個數據幀並獲得差異但是 df1 中的列是 df2 中列的子集。

df1:
Date       Fruit  Num  Color 
2013-11-24 Banana 22.1 Yellow
2013-11-24 Orange  8.6 Orange
2013-11-24 Apple   7.6 Green
2013-11-24 Celery 10.2 Green

df2:
Date       Fruit  Num  Color  A
2013-11-24 Banana 22.1 Yellow 1 
2013-11-24 Orange  8.6 Orange 2
2013-11-24 Apple   7.6 Green  3 
2013-11-24 Celery 10.2 Green  4
2013-11-25 Apple  22.1 Red    5
2013-11-25 Orange  8.6 Orange 6

我想通過僅比較這些列的共同點來獲得兩個 df 的差異。 所以我期望得到的結果是

         Date   Fruit   Num   Color A
4  2013-11-25   Apple  22.1     Red 5
5  2013-11-25  Orange   8.6  Orange 6

有沒有辦法這樣做? 任何幫助表示贊賞。

如果您在df1df2[df1.columns]沒有重復項,您可以嘗試將.drop_duplicateskeep=False一起使用:

res = pd.concat([df1, df2[df1.columns]]).drop_duplicates(keep=False)

您的示例數據框的結果:

         Date   Fruit   Num   Color
4  2013-11-25   Apple  22.1     Red
5  2013-11-25  Orange   8.6  Orange

PS:據我所知,其他答案也僅涵蓋非重復案例。

如果您在df1df2[df1.columns]中確實有重復項並希望將它們保留在結果中,您可以嘗試:

res = pd.concat(
    [df1.drop_duplicates(), df2[df1.columns].drop_duplicates()]
).drop_duplicates(keep=False).merge(
    pd.concat([df1, df2[df1.columns]]), on=list(df1.columns), how="inner"
)
  • 首先刪除原件中的重復項,然后刪除連接數據幀上的重復項:這將為您提供不在兩者中的行。
  • 然后通過與第一步的結果進行內部合並,從原始數據中獲取正確數量的行。

例如,如果df2看起來像

Date       Fruit  Num  Color  A
2013-11-24 Banana 22.1 Yellow 1 
2013-11-24 Orange  8.6 Orange 2
2013-11-24 Apple   7.6 Green  3 
2013-11-24 Celery 10.2 Green  4
2013-11-25 Apple  22.1 Red    5
2013-11-25 Apple  22.1 Red    5
2013-11-25 Orange  8.6 Orange 6

那么結果將是

         Date   Fruit   Num   Color
0  2013-11-25   Apple  22.1     Red
1  2013-11-25   Apple  22.1     Red
2  2013-11-25  Orange   8.6  Orange

如果您不想在結果中保留重復項,那么只需執行

res = pd.concat(
    [df1.drop_duplicates(), df2[df1.columns].drop_duplicates()]
).drop_duplicates(keep=False)

首先你得到 df1 的列名

df1_columns = df1.columns # ["Date", "Fruit", "Num", "Color"]

現在您創建一個新的 df2 dataframe 只有 df1 列

df2_filtered = df2[df1_columns]

現在您可以應用其他問題的解決方案。

#concatenate both dataframes
df = pd.concat([df1, df2_filtered])
df = df.reset_index(drop=True)

#group by
df_gpby = df.groupby(list(df.columns))

# get index of unique records
idx = [x[0] for x in df_gpby.groups.values() if len(x) == 1]

#filter
df.reindex(idx)

希望能幫助到你!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM