亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如果某些行值與第二個 DataFrame 中的行值相同,則有效地從 DataFrame 中刪除行

如果某些行值與第二個 DataFrame 中的行值相同,則有效地從 DataFrame 中刪除行

幕布斯6054654 2021-08-24 16:42:37
import pandas as pddf1 = pd.DataFrame({'id':   [ 1,  1,  1,  2,  2,  2,  3,  3,  3],                     'nr':   [91, 92, 93, 91, 92, 93, 91, 92, 93],                     'val_a':[22, 23, 24, 33, 34, 35, 44, 43, 42]})df2 = pd.DataFrame({'id':   [ 1,  1,  2,  3,  4,  4,  3,  5],                     'nr':   [91, 92, 91, 99, 92, 93, 92, 99],                     'val_a':[72, 27, 74, 83, 84, 85, 84, 83]})def eliminate1 ():     for i1, row1 in df1.iterrows():        for i2, row2 in df2.iterrows():            if row1['id'] == row2['id'] and row1['nr'] == row2['nr']:                df1.drop(i1, inplace=True)    df1.reset_index(drop=True, inplace=True)    print(df1)eliminate1()我想刪除 df1 中的所有行,其中 'id' AND 'nr' 在 df2 的任何行中具有相等的值。消除1()效果很好,見下面的結果,但在大數據集的情況下非常慢。這是 df1 和 df2:   id  nr  val_a0   1  91     221   1  92     232   1  93     243   2  91     334   2  92     345   2  93     356   3  91     447   3  92     438   3  93     42    id  nr  val_a0   1  91     721   1  92     272   2  91     743   3  99     834   4  92     845   4  93     856   3  92     847   5  99     83 這里的結果應該是這樣的:   id  nr  val_a0   1  93     241   2  92     342   2  93     353   3  91     444   3  93     42有誰知道如何編寫更快的代碼和/或使用已經存在的函數?
查看完整描述

3 回答

?
郎朗坤

TA貢獻1921條經驗 獲得超9個贊

merge

您可以merge使用indicator=True并僅包含標記為 的那些行'left_only'。


res = df1.merge(df2.drop('val_a', 1), how='left', on=['id', 'nr'], indicator=True)

res = res.loc[res['_merge'] == 'left_only'].drop('_merge', 1)


print(res)


   id  nr  val_a

2   1  93     24

4   2  92     34

5   2  93     35

6   3  91     44

8   3  93     42

該解決方案很容易適應任何條件,具體取決于'left_only'、'right_only'或'both'。


查看完整回答
反對 回復 2021-08-24
?
猛跑小豬

TA貢獻1858條經驗 獲得超8個贊

isin將merge列壓縮后的方法1tuple


df1[~df1[['id','nr']].apply(tuple,1).isin(df2[['id','nr']].apply(tuple,1))]

Out[43]: 

   id  nr  val_a

2   1  93     24

4   2  92     34

5   2  93     35

6   3  91     44

8   3  93     42

方法二numpy廣播


s1=df1[['id','nr']].values

s2=df2[['id','nr']].values

df1[~np.any(np.all(s1==s2[:,None],-1),0)]

Out[64]: 

   id  nr  val_a

2   1  93     24

4   2  92     34

5   2  93     35

6   3  91     44

8   3  93     42

我的方法計時


%timeit df1[~df1[['id','nr']].apply(tuple,1).isin(df2[['id','nr']].apply(tuple,1))]

100 loops, best of 3: 3.67 ms per loop

def m2():

    s1 = df1[['id', 'nr']].values

    s2 = df2[['id', 'nr']].values

    return df1[~np.any(np.all(s1 == s2[:, None], -1), 0)]

%timeit m2()

1000 loops, best of 3: 926 μs per loop


查看完整回答
反對 回復 2021-08-24
?
aluckdog

TA貢獻1847條經驗 獲得超7個贊

能inner join解決你的問題嗎?獲取與條件匹配的參數的索引,然后將其過濾掉。reset_index()如果你想這樣做,你只需要事后去做。


df3 = df1.merge(df2, how = 'inner', on = ['id','nr']).reset_index()

id_list = df3['id'].tolist()

df4 = df1[~df1['id'].isin(id_list)]


查看完整回答
反對 回復 2021-08-24
  • 3 回答
  • 0 關注
  • 297 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號