Я хочу объединить 2 таблицы с одинаковыми именами столбцов, таблица 1 содержит юниверс данных с некоторыми NA, таблица 2 содержит действительные данные, для которых таблица 1 имеет значения NA.
Я хочу заполнить значение NA в таблице 1 на основе таблицы 2, используя соединения.
Обновлено: таблица 2 не содержит всех столбцов, как таблица 1.
Я попробовал это
import pandas as pd
data1 = pd.DataFrame([[1, 2, 3], [4, 5, 6], [7, 8,]], columns=['A', 'B', 'C'])
data2 = pd.DataFrame([[7, 8, 9]], columns=['A','B','C'])
data1.merge(data2, on=['A','B'], how='left')
Результат, который я ожидаю:
Вывод, который я получил:
Похоже, вам захочется pd.concat([data1, data2]).groupby(['A', 'B'], as_index=False).first()
Я присоединяюсь на основе столбцов A и B. Если в столбце A указано «Нет», то объединение не будет работать.
вы пробовали этот подход: stackoverflow.com/a/29357685/12934163?
со скриншотами нелегко работать. Попробуйте скопировать в таблицы. Кроме того, вопрос выглядит хорошо
нет, конкат не сработает. Таблица 2 не содержит всех столбцов, как таблица 1.
@Варша, можешь ли ты уточнить свой пример? Он хорошо работает с нынешним.
@TiTo, data1.combine_first(data2) решил проблему. Спасибо
@mozway, data1.combine_first(data2) решил проблему. Спасибо
Если вы всегда «присоединяетесь» на основе известных столбцов, то вы, вероятно, захотите объединить и groupby.first (или последним, если у вас разные значения и вы хотите отдать приоритет новому) :
out = pd.concat([data1, data2]).groupby(['A', 'B'], as_index=False).first()
Альтернативно:
cols = ['A', 'B']
out = (data1.set_index(cols)
.combine_first(data2.set_index(cols))
.reset_index()
)
Или, предположив, что у вас есть индекс диапазона в data1
и нет дубликатов для A/B в data2
(в противном случае это приведет к неверным результатам), используя слияние:
out = data1.combine_first(data1[cols].merge(data2, how='left'))
Выход:
A B C
0 1 2 3.0
1 4 5 6.0
2 7 8 9.0
А что, если бы у тебя был
data2 = pd.DataFrame([[None, 8, 9]], columns=['A','B','C'])
?