2017-06-14 182 views
1

我有兩個不同大小的數據幀(df1df2)。我想從df1中刪除存儲在df2內的所有行。用Pandas從另一個數據幀中刪除一個數據幀

所以,如果我有df2等於:

 A B 
0 wer 6 
1 tyu 7 

而且df1等於:

 A B C 
0 qwe 5 a 
1 wer 6 s 
2 wer 6 d 
3 rty 9 f 
4 tyu 7 g 
5 tyu 7 h 
6 tyu 7 j 
7 iop 1 k 

最終的結果應該是像這樣:

 A B C 
0 qwe 5 a 
1 rty 9 f 
2 iop 1 k 

我能通過使用for循環實現我的目標,但我想知道是否有更好,更elega nt和有效的方式來執行此類操作。

這裏是我的情況下寫的代碼,你需要它: 進口大熊貓作爲PD

df1 = pd.DataFrame({'A' : ['qwe', 'wer', 'wer', 'rty', 'tyu', 'tyu', 'tyu', 'iop'], 
        'B' : [ 5,  6,  6,  9,  7,  7,  7,  1], 
        'C' : ['a' , 's', 'd', 'f', 'g', 'h', 'j', 'k']}) 

df2 = pd.DataFrame({'A' : ['wer', 'tyu'], 
        'B' : [ 6,  7]}) 

for i, row in df2.iterrows(): 
    df1 = df1[(df1['A']!=row['A']) & (df1['B']!=row['B'])].reset_index(drop=True) 

回答

4

使用merge與外與query過濾,最後刪除輔助柱參加由drop

df = pd.merge(df1, df2, on=['A','B'], how='outer', indicator=True) 
     .query("_merge != 'both'") 
     .drop('_merge', axis=1) 
     .reset_index(drop=True) 
print (df) 
    A B C 
0 qwe 5 a 
1 rty 9 f 
2 iop 1 k 
+0

是否可以指定列名稱'A'和'B'? –

+0

是的,當然,在' – jezrael

+0

dekujiu moc kamarad!上添加參數! –

2

您可以使用np.in1d檢查df2中是否存在df1中的任何行。然後將其用作反轉蒙版以從df1中選擇行。

df1[~df1[['A','B']].apply(lambda x: np.in1d(x,df2).all(),axis=1)]\ 
        .reset_index(drop=True) 
Out[115]: 
    A B C 
0 qwe 5 a 
1 rty 9 f 
2 iop 1 k 
1

pandas有一個名爲isin方法,但是這依賴於唯一索引。我們可以定義一個lambda函數來創建我們可以在df1df2的現有'A''B'中使用的列。然後,我們否定這一點(因爲我們要的不是df2值),並重置索引:

import pandas as pd 

df1 = pd.DataFrame({'A' : ['qwe', 'wer', 'wer', 'rty', 'tyu', 'tyu', 'tyu', 'iop'], 
        'B' : [ 5,  6,  6,  9,  7,  7,  7,  1], 
        'C' : ['a' , 's', 'd', 'f', 'g', 'h', 'j', 'k']}) 

df2 = pd.DataFrame({'A' : ['wer', 'tyu'], 
        'B' : [ 6,  7]}) 

unique_ind = lambda df: df['A'].astype(str) + '_' + df['B'].astype(str) 
print df1[~unique_ind(df1).isin(unique_ind(df2))].reset_index(drop=True) 

印刷:

 A B C 
0 qwe 5 a 
1 rty 9 f 
2 iop 1 k 
0

我發現的最徹底的方法是使用的指數使用從大熊貓下降你想丟棄的數據幀:

df1.drop(df2.index, axis=0,inplace=True) 
相關問題