我想比較資料幀的差異。 xyz具有與 相同的所有列abc,但它有一個附加列。
在比較中,我想匹配兩個類似的列 ( Sport),但只SportLeague在輸出中顯示 (如果存在差異,那就是)。示例,而不是將“足球”顯示為差異,而是顯示“足球:MLS”,它是xyz)中的相鄰列
這是兩個資料框的螢屏截圖:

import pandas as pd
import numpy as np
abc = {'Sport' : ['Football', 'Basketball', 'Baseball', 'Hockey'], 'Year' : ['2021','2021','2022','2022'], 'ID' : ['1','2','3','4']}
abc = pd.DataFrame({k: pd.Series(v) for k, v in abc.items()})
abc
xyz = {'Sport' : ['Football', 'Football', 'Basketball', 'Baseball', 'Hockey', 'Soccer'], 'SportLeague' : ['Football:NFL', 'Football:XFL', 'Basketball:NBA', 'Baseball:MLB', 'Hockey:NHL', 'Soccer:MLS'], 'Year' : ['2022','2019', '2022','2022','2022', '2022'], 'ID' : ['2','0', '3','2','4', '1']}
xyz = pd.DataFrame({k: pd.Series(v) for k, v in xyz.items()})
xyz = xyz.sort_values(by = ['ID'], ascending = True)
xyz
已經嘗試過的代碼:
abc.compare(xyz, align_axis=1, keep_shape=False, keep_equal=False)
我得到的錯誤如下(因為資料框沒有完全相同的列):

例子。如果 xyz['Sport'] 沒有出現在 abc['Sport'] 中的任何位置,則顯示 xyz['SportLeague]' 作為資料幀之間的差異
進一步澄清邏輯:
abc['Sport'] 是否出現在 xyz['Sport'] 中的任何位置?如果沒有,請注明“未找到xyz data frame”。如果確實存在,其對應的 abc['Year'] 和 abc['ID'] 值是否相同?如果不是,則顯示“從 xyz['Year'] 和 xyz['ID'] 更改為 abc['Year'] 和 abc['ID']。
xyz['Sport'] 是否出現在 abc['Sport'] 的任何位置?如果沒有,請注明“洗掉xyz['SportLeague']”。
我上面解釋的與.compare方法類似。但是,此示例中的資料幀可能長度不同,并且具有不同數量的變數。
uj5u.com熱心網友回復:
如果我理解正確,我們基本上想要合并兩個 DataFrame,然后在兩個 DataFrame 之間應用一些比較,并添加一個列來解釋要采取的行動程序,給定比較的特定結果。
注意:在這里的示例中,我在您的 df 中添加了一項運動('Cricket')abc,以觸發條件abc['Sport']不存在于xyz['Sport'].
abc = {'Sport' : ['Football', 'Basketball', 'Baseball', 'Hockey','Cricket'], 'Year' : ['2021','2021','2022','2022','2022'], 'ID' : ['1','2','3','4','5']}
abc = pd.DataFrame({k: pd.Series(v) for k, v in abc.items()})
print(abc)
Sport Year ID
0 Football 2021 1
1 Basketball 2021 2
2 Baseball 2022 3
3 Hockey 2022 4
4 Cricket 2022 5
我xyz保持不變。現在,讓我們合并這兩個 dfs:
df = xyz.merge(abc, on='Sport', how='outer', suffixes=('_xyz','_abc'))
print(df)
Sport SportLeague Year_xyz ID_xyz Year_abc ID_abc
0 Football Football:XFL 2019 0 2021 1
1 Football Football:NFL 2022 2 2021 1
2 Soccer Soccer:MLS 2022 1 NaN NaN
3 Baseball Baseball:MLB 2022 2 2022 3
4 Basketball Basketball:NBA 2022 3 2021 2
5 Hockey Hockey:NHL 2022 4 2022 4
6 Cricket NaN NaN NaN 2022 5
現在,我們有一個 df ,我們可以在其中使用np.select(conditions, choices, default). 像這樣:
conditions = [ df.Year_abc.isnull(),
df.Year_xyz.isnull(),
(df.Year_xyz != df.Year_abc) & (df.ID_xyz != df.ID_abc),
df.Year_xyz != df.Year_abc,
df.ID_xyz != df.ID_abc
]
choices = [ 'Sport not in abc',
'Sport not in xyz',
'Change year and ID to xyz',
'Change year to xyz',
'Change ID to xyz']
df['action'] = np.select(conditions, choices, default=np.nan)
結果如下所示,其中包含一個新列action,其中包含關于采取何種行動的注釋。
Sport SportLeague Year_xyz ID_xyz Year_abc ID_abc \
0 Football Football:XFL 2019 0 2021 1
1 Football Football:NFL 2022 2 2021 1
2 Soccer Soccer:MLS 2022 1 NaN NaN
3 Baseball Baseball:MLB 2022 2 2022 3
4 Basketball Basketball:NBA 2022 3 2021 2
5 Hockey Hockey:NHL 2022 4 2022 4
6 Cricket NaN NaN NaN 2022 5
action
0 Change year and ID to xyz # match, but mismatch year and ID
1 Change year and ID to xyz # match, but mismatch year and ID
2 Sport not in abc # no match: Sport in xyz, but not in abc
3 Change ID to xyz # match, but mismatch ID
4 Change year and ID to xyz # match, but mismatch year and ID
5 nan # complete match: no action needed
6 Sport not in xyz # no match: Sport in abc, but not in xyz
讓我知道這是否是對您要實作的目標的正確解釋。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/488961.html
