2016-11-29 5 views
3

Я делаю присоединение двух данных (A и B) в пандах python.Pandas аналог JOIN с предложением WHERE

Цель состоит в том, чтобы получить все чистые строки из B (SQL права присоединиться к аналого B на A.client_id = B.client_id где A.client_id равен нуль)

В панде все, что я знаю, для этой операции чтобы сделать слияние, но я не знаю, как установить условия (где пункт):

x=pd.merge(A,B,how='right',on=['client_id','client_id'] 

Спасибо!

+0

Я думаю, вам нужен только один «client_id» в аргументе 'on'. Используйте список, если вы хотите присоединиться к нескольким столбцам. Используйте 'left_on' и' right_on', чтобы отдельно указывать столбец для двух данных. – TheEspinosa

ответ

2

вариант 1
indicator=True

A.merge(B, on='client_id', how='right', indicator=True) \ 
    .query('_merge == "right_only"').drop('_merge', 1) 

установки

A = pd.DataFrame(dict(client_id=[1, 2, 3], valueA=[4, 5, 6])) 
B = pd.DataFrame(dict(client_id=[3, 4, 5], valueB=[7, 8, 9])) 

Результаты

enter image description here

больше объяснений
indicator=True помещает еще один столбец в результатах слияния, который указывает, что ли строки результаты слева, справа, или оба.

A.merge(B, on='client_id', how='outer', indicator=True) 

enter image description here

Итак, я просто использовать query отфильтровать индикатор right_only затем уронить этот столбец.


вариант 2
на самом деле не слияние.Вы можете использовать query снова только тянуть строки из B, где его 'client_id' s не в A

B.query('client_id not in @A.client_id') 

или эквивалентный способ сказать то же самое (но быстрее)

B[~B.client_id.isin(A.client_id)] 

enter image description here

3

Для меня это тоже немного неудовлетворителен, но я думаю, что рекомендуемый способ что-то вроде x=pd.merge(A[A["client_ID"].isnull()],B,how='right',on=['client_id','client_id'])

Более подробную информацию можно найти в pandas documentation

Кроме того, вы можете использовать что-то вроде A.where(A["client_ID"].isnull()) для фильтрации , Также обратите внимание на мою ошибку в предыдущей версии. Я сравнивал с None, но вы должны использовать функцию isnull()

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