Как объединить кадры данных Pandas без дублирования столбцов - PullRequest
0 голосов
/ 02 февраля 2019

У меня есть данные в форме:

frame1 = pd.DataFrame({'supplier1_match0': ['x'], 'id': [1]})
frame2 = pd.DataFrame({'supplier1_match0': ['2x'], 'id': [2]})

и я хочу объединить несколько кадров в кадр следующим образом:

base_frame = pd.DataFrame({'id':[1,2,3]})

Я объединяю идентификатор и получаю:

merged = base_frame.merge(frame1, how='left', left_on='id', right_on='id')
merged = merged.merge(frame2, how='left', left_on='id', right_on='id')

   id supplier1_match0_x supplier1_match0_y
0   1                  x                NaN
1   2                NaN                 2x
2   3                NaN                NaN

Столбец дублируется, и добавляется символ «y».Вот что мне нужно:

id, supplier1_match0, ...
1,  x
2,  2x
3, NaN

Есть ли простой способ добиться этого?Возникает аналогичный вопрос ( Вложенный словарь к многоиндексному кадру данных, где ключи словаря - это метки столбцов ), но данные имеют другую форму.Обратите внимание, что у меня есть несколько поставщиков, и у них различное количество совпадений, поэтому я не могу предположить, что данные будут иметь «прямоугольную» форму.Заранее спасибо.

1 Ответ

0 голосов
/ 02 февраля 2019

Ваша проблема в том, что вы не хотите просто merge все.Вам нужно concat ваш первый набор кадров, затем объединить.

import pandas as pd
import numpy as np

base_frame.merge(pd.concat([frame1, frame2]), how='left')

#   id supplier1_match0
#0   1                x
#1   2               2x
#2   3              NaN

В качестве альтернативы, вы можете определить base_frame, чтобы он имел все соответствующие столбцы других кадров, и установитьid в качестве индекса и использовать .update.Это гарантирует, что base_frame остается того же размера, в то время как выше не делает.Хотя данные будут перезаписаны, если для данной ячейки будет несколько ненулевых значений.

base_frame = pd.DataFrame({'id':[1,2,3]}).assign(supplier1_match0 = np.NaN).set_index('id')

for df in [frame1, frame2]:
    base_frame.update(df.set_index('id'))

print(base_frame)

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