Команда объединения / объединения панд, чтобы пометить все общие экземпляры столбца в df аналогично столбцу другого df - PullRequest
0 голосов
/ 26 июня 2019

У меня есть два фрейма данных, один с именем 'foo' и один с именем 'bar'. Мой фрейм данных 'foo' имеет несколько уникальных столбцов, а мой фрейм данных 'bar' также имеет несколько уникальных столбцов. Тем не менее, они оба разделяют один столбец, столбец "Google". Я пытаюсь увидеть, есть ли способ сохранить все столбцы во фрейме данных 1, «foo», и добавить еще один столбец, столбец «CLRS», который будет равен 1, если содержание в столбце «Google» в этом строка «foo» появляется где-то в столбце «google» в «баре».

В частности, давайте предположим, что мои фреймы данных имеют такую ​​структуру: 'foo' содержит столбцы: 'foo_1', 'foo_2', ..., 'google', а bar содержит столбцы: 'bar_1', 'bar_2 ..., "Google". Я хочу объединить / объединить «foo» и «bar» таким образом, чтобы у «foo» был дополнительный столбец «CLRS», чтобы у «CLRS» был 1, если содержимое «google» в этой строке foo 'появляются в какой-то момент в столбце' google 'на панели' bar '. Я пробовал следующий код:

      '''
         # foo examples
         foo['foo1'] = ['dijkstra','TSP',...]
         foo['foo2'] = ['Oculus','VR', ...]
         .
         .
         .
         foo['google'] = ['search','ads', 'A/B Testing', 'UI' ...]

         # bar examples
         bar['bar1'] = ['dijkstra','TSP',...]
         bar['bar2'] = ['search','ads', ...]
         .
         .
         .
         # 'A/B Testing' appears in the column somewhere but 'ads' does 
         # not
         bar['google'] = ['search','google_search', 'TDD', 'UI', 
         ...,'A/B Testing', ...]

         # my code
         foo_merged = 
                    foo.join(bar, how = 'left')

         # my result 
         foo_merged['foo1'] = ['dijkstra','TSP',...]
         foo_merged['foo2'] = ['search','ads', ...]
         .
         .
         .
         foo_merged['google'] = ['search','ads', ...]
         foo_merged['CLRS']   = ['search','google_search', 'TDD', 'UI', 
         ...]

         # What I want as an output for foo_merged is:
         foo_merged['foo1'] = ['dijkstra','TSP',...]
         foo_merged['foo2'] = ['search','ads', ...]
         .
         .
         .
         foo_merged['google'] = ['search','ads', 'A/B Testing', 'UI' 
         ...]
         foo_merged['CLRS']   = [1,0,1,1,...]
      '''

К сожалению, после запуска предыдущего кода соединения foo_merged содержит все столбцы foo и один дополнительный столбец, который всегда содержит содержимое столбца «google» из «bar». Вместо этого моим желаемым результатом будет df, такой, что дополнительный столбец «CLRS» содержит 1, если содержимое «google» в этой строке «foo» появляется где-то как содержимое столбца «google» в «bar», и 0 в противном случае .

1 Ответ

0 голосов
/ 26 июня 2019

Я полагаю, что вы ищете merge с индикатором = True .
Индикатор будет отмечать каждую строку, которая находится или нет в обоих DataFrames

df = pd.merge(foo, bar, how='left', on = 'google', indicator = True)
df['CLRS'] = (df['_merge'] == 'both').astype(int)    
#or df['CLRS'] = np.where(df['_merge'] == 'both', 1, 0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...