Хобрук: Ваш путь к мастерству в программировании

Как сопоставить на основе нескольких ключей в пандах без слияния

У меня есть два кадра данных, как указано ниже

1-й кадр данных

data_file = pd.DataFrame({'person_id':[1,1,1,1,1,1,1,2,2,2,2,3,3,3,3,3,3,3],
             'event name': ['Second','First','Second','First','Second','First','Second','First','Second','Second','First','Second','First','Second','First','Second','First','First'],
             'ob.date': [np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan]
             })

2-й кадр данных

out_data = pd.DataFrame({'person_id':[1,1,2,2,3,3],'event name':['First','Second','First','Second','First','Second'],
                     'ob.date': ['23/08/2017','23/08/2017','11/08/2017','31/08/2017','25/08/2017','22/08/2017']})

Первый кадр данных выглядит так, как показано ниже.

введите здесь описание изображения

Второй кадр данных выглядит так, как показано ниже.

введите здесь описание изображения

Что я хотел бы сделать, так это сопоставить значения ob.date из кадра данных out_data с data_file на основе person_id и event name.

Это то, что я пробовал

s = out_data.set_index(['person_id','event name'])['ob.date']
data_file['ob.date'] = data_file[('person_id','event name')].map(s)

Столкнулся с ошибкой ниже

KeyError: ('person_id', 'имя события')

# But merge works well. Is the below correct?

pd.merge(data_file,out_data, on = ['person_id','event name'],how = 'inner')

Как я могу избежать этого и сопоставить значения даты на основе нескольких ключей и добиться результата, как показано ниже?

введите здесь описание изображения


Ответы:


1

Я думаю, что здесь лучше объединить с левым соединением:

df = pd.merge(data_file,out_data, on = ['person_id','event name'], how = 'left')

map возможно, но нужны кортежи из обоих столбцов:

s = out_data.set_index(['person_id','event name'])['ob.date']
s.index = s.index.tolist()
print (s)
(1, First)     23/08/2017
(1, Second)    23/08/2017
(2, First)     11/08/2017
(2, Second)    31/08/2017
(3, First)     25/08/2017
(3, Second)    22/08/2017
Name: ob.date, dtype: object

s1 = pd.Series(list(map(tuple, data_file[['person_id','event name']].values.tolist())), 
               index=data_file.index)
data_file['ob.date'] = s1.map(s)

Или похожие:

s1 = data_file.set_index(['person_id','event name']).index.to_series()
s1.index = data_file.index
data_file['ob.date'] = s1.map(s)

print (data_file)
   person_id event name     ob.date
0           1     Second  23/08/2017
1           1      First  23/08/2017
2           1     Second  23/08/2017
3           1      First  23/08/2017
4           1     Second  23/08/2017
5           1      First  23/08/2017
6           1     Second  23/08/2017
7           2      First  11/08/2017
8           2     Second  31/08/2017
9           2     Second  31/08/2017
10          2      First  11/08/2017
11          3     Second  22/08/2017
12          3      First  25/08/2017
13          3     Second  22/08/2017
14          3      First  25/08/2017
15          3     Second  22/08/2017
16          3      First  25/08/2017
17          3      First  25/08/2017
20.08.2019
  • Можно ли объединить только несколько столбцов? Я имею в виду, что в реальных данных мой фрейм данных out_data имеет несколько столбцов, таких же, как data_file, поэтому он генерирует _y для всех идентичных столбцов. Вместо этого можно сделать что-то подобное? `pd.merge(data_file,out_data['ob.date,Reading], on = ['person_id','имя события'], как = 'left')` 20.08.2019
  • @SSMK, да, нужно только двойное [], например, изменить out_data['ob.date,Reading] на out_data[['ob.date','Reading']] 20.08.2019
  • Новые материалы

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..

    Настольный ПК как «одно кольцо, чтобы править всеми» домашних компьютеров
    Вид после 9 месяцев использования С настольных компьютеров все началось, но в какой-то момент они стали «серверами», и мы все перешли на ноутбуки. В прошлом году я столкнулся с идеей настольных..

    Расширенные методы безопасности для VueJS: реализация аутентификации без пароля
    Руководство, которое поможет вам создавать безопасные приложения в долгосрочной перспективе Безопасность приложений часто упускается из виду в процессе разработки, потому что основная..

    стройный-i18следующий
    Представляем стройную оболочку для i18next. Эта библиотека, основанная на i18next, заключает экземпляр i18next в хранилище svelte и отслеживает события i18next, такие как languageChanged,..

    Обзор 20 основных и современных методов работы с массивами в JavaScript
    Вы знаете их всех? В этом коротком посте я покажу сводку методов, доступных в JavaScript для работы с массивами. Я надеюсь, что вы найдете это полезным! В конце поста вы найдете ссылку на..

    Да, но я чувствую необходимость указать, что это или не единственные два.
    Да, но я чувствую необходимость указать, что это или не единственные два. Обучение с подкреплением (в качестве примера) также является важным.