2017-02-21 11 views
1

私は2つのデータフレームを持っています。 DFおよびSubDFSubDFDFのサブセットです。私はSubDFにないDFの行を抽出したいと思います。サブセットデータフレームではないパンダデータフレームの行を抽出する方法

私は次のことを試してみました:

DF2 = DF[~DF.isin(SubDF)] 

行の数が正しく、ほとんどの行はDF2subDF +行数で、行の

すなわち番号正しい= DFの行数

が、私は、元のDF

に存在しない NaN値を持つ行を取得します

私が間違っていることがわかりません。

注:元DFはどんなNaN値を持っていない、と私は前にDF.dropna()を行なったし、結果はまだDataFrame.isinvaluesindex一致を必要とするので、あなたは、outer joinboolean indexingmergeを必要NaN

答えて

2

を生成二重チェックします:

DF = pd.DataFrame({'A':[1,2,3], 
        'B':[4,5,6], 
        'C':[7,8,9], 
        'D':[1,3,5], 
        'E':[5,3,6], 
        'F':[7,4,3]}) 

print (DF) 
    A B C D E F 
0 1 4 7 1 5 7 
1 2 5 8 3 3 4 
2 3 6 9 5 6 3 

SubDF = pd.DataFrame({'A':[3], 
        'B':[6], 
        'C':[9], 
        'D':[5], 
        'E':[6], 
        'F':[3]}) 

print (SubDF) 
    A B C D E F 
0 3 6 9 5 6 3 
#return no match 
DF2 = DF[~DF.isin(SubDF)] 
print (DF2) 
    A B C D E F 
0 1 4 7 1 5 7 
1 2 5 8 3 3 4 
2 3 6 9 5 6 3 

DF2 = pd.merge(DF, SubDF, how='outer', indicator=True) 
DF2 = DF2[DF2._merge == 'left_only'].drop('_merge', axis=1) 
print (DF2) 
    A B C D E F 
0 1 4 7 1 5 7 
1 2 5 8 3 3 4 
1

別の方法、@jezraelからセットアップを借りる:

df = pd.DataFrame({'A':[1,2,3], 
        'B':[4,5,6], 
        'C':[7,8,9], 
        'D':[1,3,5], 
        'E':[5,3,6], 
        'F':[7,4,3]}) 

sub = pd.DataFrame({'A':[3], 
        'B':[6], 
        'C':[9], 
        'D':[5], 
        'E':[6], 
        'F':[3]}) 

extract_idx = list(set(df.index) - set(sub.index)) 
df_extract = df.loc[extract_idx] 

行は、元のDF順にソートされない場合があります。一致する注文が必要な場合:

extract_idx = list(set(df.index) - set(sub.index)) 
idx_dict = dict(enumerate(df.index)) 
order_dict = dict(zip(idx_dict.values(), idx_dict.keys())) 
df_extract = df.loc[sorted(extract_idx, key=order_dict.get)] 
関連する問題