2017-08-18 11 views
1

私は2つのデータフレームを扱います。私は最初のデータフレームのラインを、別のラインのマッチに基づいて削除したい。別のデータフレームのルックアップに基づいてデータフレーム内の行を削除する

df1には、2つの列(タイプ1 &タイプ2と呼ばれます)+フラグがあります。 flag = Trueの行を削除したい&ここでType1 & Type2は別のdf2の組み合わせと一致します。例えば

import pandas as pd 
import numpy as np 
df1 = pd.DataFrame(np.random.randint(0,10,size=(100, 2)),columns = ["Type1","Type2"]) 
df1["Flag"] = np.random.randint(0,10,size=(100))>6 
df1.head() 

    Type1 Type2 Flag 
0  8  5 False 
1  1  6 False 
2  9  2 False 
3  0  9 True 
4  2  9 False 

df2 = pd.DataFrame(np.random.randint(0,10,size=(100, 2)),columns = ["Type1","Type2"]) 
df2.head() 

    Type1 Type2 
0  0  9 
1  7  8 
2  5  1 
3  3  3 
4  3  2 

フラグがtrue = AND(0,9)DF2に存在するようにインデックス= 3を削除しなければならないDF1ここライン。次いで

答えて

3

1人のDFに使用mergeboolean indexingでフィルタ - 必要df1でのみ値(left_only)とFlagFalseTruebothと行が削除されるように。

#on parameter omitted if only matched column are same in both df 
df3 = pd.merge(df1, df2, how='left', indicator=True) 
#if multiple matched columns 
#df3 = pd.merge(df1, df2, how='left', indicator=True, on = ['Type1','Type2']) 
print (df3) 
    Type1 Type2 Flag  _merge 
0  8  5 False left_only 
1  1  6 False left_only 
2  9  2 False left_only 
3  0  9 True  both 
4  2  9 False left_only 

df3 = df3.loc[(df3['_merge'] == 'left_only') & (~df3['Flag']), ['Type1','Type2']] 
print (df3) 
    Type1 Type2 
0  8  5 
1  1  6 
2  9  2 
4  2  9 

また、マスクを作成し、唯一df1(多くの列の場合)をフィルタリングすることも可能である:

m = (df3['_merge'] == 'left_only') & (~df3['Flag']) 
df1 = df1[m] 
print (df1) 
    Type1 Type2 Flag 
0  8  5 False 
1  1  6 False 
2  9  2 False 
4  2  9 False 
+0

はそれが完璧だ、ありがとう。私は自分のSQLロジックから抜け出すのが難しいです。 – Nicolas

関連する問題