Как объединить две панды DataFrames и сохранить повторяющиеся значения? - PullRequest
2 голосов
/ 04 ноября 2019

У меня есть следующие две панды DataFrames:

Первая:

df1 = pd.DataFrame({'Name':['John','John','John','Paul','Paul','Jimmy'], 'Book':['B1','B2','B1','B3','B4','B3']})
╔═══════╦══════╗
║ Name  ║ Book ║
╠═══════╬══════╣
║ John  ║ B1   ║
║ John  ║ B2   ║
║ John  ║ B1   ║
║ Paul  ║ B3   ║
║ Paul  ║ B4   ║
║ Jimmy ║ B3   ║
╚═══════╩══════╝

Вторая:

df2 = pd.DataFrame({'Name':['John','Paul','Jimmy'], 'Age':[25,18,28]})
╔═══════╦═════╗
║ Name  ║ Age ║
╠═══════╬═════╣
║ John  ║  25 ║
║ Paul  ║  18 ║
║ Jimmy ║  28 ║
╚═══════╩═════╝

И я хочу, чтобы результат был:

╔═══════╦══════╦═════╗
║ Name  ║ Book ║ Age ║
╠═══════╬══════╬═════╣
║ John  ║ B1   ║  25 ║
║ John  ║ B2   ║  25 ║
║ John  ║ B1   ║  25 ║
║ Paul  ║ B3   ║  18 ║
║ Paul  ║ B4   ║  18 ║
║ Jimmy ║ B3   ║  28 ║
╚═══════╩══════╩═════╝

То есть добавление столбца «Возраст» в первый кадр данных с использованием столбца «Имя» в качестве ключа и сохранение повторяющихся имен.

Ответы [ 2 ]

4 голосов
/ 04 ноября 2019

Это так же просто, как:

df1 = pd.DataFrame({'Name':['John','John','John','Paul','Paul','Jimmy'], 'Book':['B1','B2','B1','B3','B4','B3']})

df2 = pd.DataFrame({'Name':['John','Paul','Jimmy'], 'Age':[25,18,28]})

df1.merge(df2)

Out[22]: 
    Name Book  Age
0   John   B1   25
1   John   B2   25
2   John   B1   25
3   Paul   B3   18
4   Paul   B4   18
5  Jimmy   B3   28
2 голосов
/ 04 ноября 2019

Используйте set_index и map:

df1['Age'] = df1['Name'].map(df2.set_index('Name')['Age'])
print(df1)

Вывод:

    Name Book  Age
0   John   B1   25
1   John   B2   25
2   John   B1   25
3   Paul   B3   18
4   Paul   B4   18
5  Jimmy   B3   28

Карта будет быстрее, чем объединение, поскольку мы отображаем только один столбец.

% timeit df1 ['Age'] = df1 ['Name']. Map (df2.set_index ('Name') ['Age'])
1,22 мс ± 34,4 мкс на цикл (среднее ± стандартное отклонение из 7 прогонов, по 1000 циклов в каждом)

% timeit df1.merge (df2)
2,93 мс ± 73,3 мкс на цикл (среднее ± стандартное отклонение из 7 прогонов, 100каждый цикл)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...