2017-06-22 18 views
2

私は2つのデータフレームがあります。同じ行が別のデータフレームに存在する場合、Pandasデータフレームの行を削除するにはどうすればよいですか?

df1 = row1;row2;row3 
df2 = row4;row5;row6;row2 

私は唯一の私の出力データフレームをしたいが、私が最も効率的にこれを取得するにはどうすればよいDF1で一意の行、すなわち:

df_out = row1;row3 

が含まれていますか?

このコードは、私が欲しいものを行いますが、forループ2を使用して:

a = pd.DataFrame({0:[1,2,3],1:[10,20,30]}) 
b = pd.DataFrame({0:[0,1,2,3],1:[0,1,20,3]}) 

match_ident = [] 
for i in range(0,len(a)): 
    found=False 
    for j in range(0,len(b)): 
     if a[0][i]==b[0][j]: 
      if a[1][i]==b[1][j]: 
       found=True 
    match_ident.append(not(found)) 

a = a[match_ident] 
+0

ない複製、I以来、両方のデータフレームの共通の値にマップされる一意のIDは持っていません。 – RRC

+0

フラグを立てることはできませんが、https://stackoverflow.com/questions/28901683/pandas-get-rows-which-are-nother-in-other-dataframe – victor

答えて

3

あなたは、パラメータindicatorで使用mergeと外部結合、フィルタリングのためのquery、その後dropでヘルパー列を削除:

DataFramesはすべての列で結合されているため、onパラメータを省略できます。

print (pd.merge(a,b, indicator=True, how='outer') 
     .query('_merge=="left_only"') 
     .drop('_merge', axis=1)) 
    0 1 
0 1 10 
2 3 30 
+0

Brilliant!インジケータパラメータの使用を考えなかった。私の問題を解決する。 – RRC

+1

うれしいことに、うれしい1日! – jezrael

0

あなたは、共通に共有されている行を決定するためにIndex.isin methodを使用し、Index Sにabを変換することができます:

import pandas as pd 
a = pd.DataFrame({0:[1,2,3],1:[10,20,30]}) 
b = pd.DataFrame({0:[0,1,2,3],1:[0,1,20,3]}) 

a_index = a.set_index([0,1]).index 
b_index = b.set_index([0,1]).index 
mask = ~a_index.isin(b_index) 
result = a.loc[mask] 
print(result) 

利回り

0 1 
0 1 10 
2 3 30 
関連する問題