2017-02-21 107 views
1

我有兩個數據幀。 DFSubDFSubDFDF的子集。我想提取DF中不在SubDF中的行。如何提取熊貓數據框中的行NOT子集數據框

我嘗試以下:

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

的行數是正確的,大多數行是正確的,

subDF +行數的行數在DF2 =在DF行數

,但我得到NaN值的行不原DF

存在

不知道我在做什麼錯。

注:原DF沒有任何NaN值,並仔細檢查我沒有DF.dropna()之前,結果仍產生NaN

回答

2

您需要mergeouter joinboolean indexing,因爲DataFrame.isin需要valuesindex比賽:

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)]