2016-11-09 3 views
3

У меня есть два кадра данных. Я хочу видеть, существуют ли конкретные строки (в целом) в другом фреймворке данных. Пример строки из df_subset:Проверьте, существует ли несколько строк в другом фрейме данных

id category value date 
1  A   10  01-01-15 
3  C   10  03-01-15 

Другой df_full:

id category value date 
1  A   10  01-01-15 
2  B   10  02-01-15 
3  C   10  03-01-15 
4  D   16  04-01-15 

Есть ли каким-то образом проверить, если строки одного dataframe существует в другой? Что-то вроде этого (очевидно, это не работает): df_subset in df_full, существуют?

> True 

ответ

3

Я думаю, что вы можете использовать merge с внутренним соединением (по умолчанию) с DataFrame.equals для сравнения с df_subset:

print (pd.merge(df_subset,df).equals(df_subset)) 
True 
+0

простой и элегантный. Спасибо. – eljusticiero67

2

вы можете использовать merge(..., indicator=True) метод:

In [14]: pd.merge(df1, df2, indicator=True, how='outer') 
Out[14]: 
    id category value  date  _merge 
0 1  A  10 01-01-15  both 
1 3  C  10 03-01-15  both 
2 2  B  10 02-01-15 right_only 
3 4  D  16 04-01-15 right_only 
2

с использованием numpy

(df_subset.values[:, None] == df_full.values).all(2).any(1).all() 

True 

времени
enter image description here

объяснение

# using [:, None] to extend into new dimension at 
# take advantage of broadcasting 
a1 = df_subset.values[:, None] == df_full.values 

    # ━> third dimension ━> 
    # ━━━━> axis=2 ━━━> 
# 1st dim 
---->[[[ True True True True] # │ 
     [False False True False] # │ second dimension 
     [False False True False] # │ axis=1 
     [False False False False]] # ↓ 

# axis=0 
---->[[False False True False] # │ 
     [False False True False] # │ second dimension 
     [ True True True True] # │ axis=1 
     [False False False False]]] # ↓ 

# first row of subset with each row of full 
[[[ True True True True] <-- This one is true for all 
    [False False True False] 
    [False False True False] 
    [False False False False]] 

# second row of subset with each row of full 
[[False False True False] 
    [False False True False] 
    [ True True True True] <-- This one is true for all 
    [False False False False]]] 

a2 = a1.all(2) 

# ┌─ first row of subset all equal 
[[ True False False False] 
[False False True False]] 
#    └─ second row of subset all equal 

a3 = a2.any(1) 

# ┌─ first row of subset matched at least one row of full 
[ True True] 
#  └─ second row of subset matched at least one row of full 

a3.all() 

True 

ВСЕ Ряды df_subset НАХОДЯТСЯ В df_full

+0

ничего себе! он действительно умный – MaxU

+0

Я расширил массив до третьего измерения. все (2) идут вдоль третьей оси. Я обновляю сообщение, чтобы сделать его более ясным. – piRSquared

+0

Я, это действительно сложно. Ненуж для меня сложный, я предпочитаю панды. – jezrael

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