2017-02-21 18 views
1

У меня есть два кадра данных. DF и SubDF. SubDF - это подмножество DF. Я хочу извлечь строки в DF, которые НЕ находятся в SubDF.Как извлечь строки в фрейме данных pandas NOT в подмножестве dataframe

Я попытался следующие:

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

Количество строк правильно и большинство строк являются правильными,

т.е. число строк в subDF + количество строк в DF2 = количество строк в DF

, но я получаю строки с NaN значениями, которые не существуют в оригинале DF

Не уверен, что я делаю неправильно.

Примечание: оригинал DF не имеет NaN значения, и перепроверить я DF.dropna() до и результат до сих пор производится NaN

ответ

2

Вам нужно merge с outer join и boolean indexing, потому что DataFrame.isin необходимость values и index матча:

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

 Смежные вопросы

  • Нет связанных вопросов^_^