Панды: объединять кадры данных разных форм на основе сравнения между кадрами данных - PullRequest
0 голосов
/ 12 мая 2018

У меня есть два dfs:

df1:
no1    no2    other1
1      10     foo
1      50     foo
1      60     cat
1      70     cat
3      12     cat

df2:
no1    start    stop    other2
1      2        40      dog
1      100      200     dog
3      5        15      dog

Я хочу объединить df1 и df2 на следующих условиях:

1) столбец № 1 совпадает, если это правда, то

2) df1['no2'] находится между df2['start'] и df2['stop']:

Желаемый вывод для приведенного выше примера будет (не нужны столбцы start/stop, нужны все остальные столбцы):

df3:
no1    no2    other1    other2
1      10     foo       dog
3      12     cat       dog

Мое проверенное решение (замысловатое, возможно, не самое эффективное): я подумал, что np.where может сделать это для меня, используя приведенный ниже код, а затем отбросить все строки, где df['merge'] = no. Но это дает мне ошибку Can only compare identically-labeled Series objects, которая, я думаю, связана с тем, что dfs имеют разные размеры. Эффективность / скорость важны, поэтому я думаю, что это не тот путь, даже если бы я мог устранить ошибку.

df2['merge'] = np.where((df1['no1'] == df2['no1'] & df2['start'] < df1['no2'] < df2['stop']), yes, no)

1 Ответ

0 голосов
/ 12 мая 2018

Outer-merge

merged = pd.merge(df1, df2, how='outer')

, затем фильтр по строкам

>>> merged[(merged.start <= merged.no2) & (merged.no2 <= merged.stop)][['no1', 'start', 'stop', 'other2']]
no1 start   stop    other2
0   1   2   40  dog
8   3   5   15  dog
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...