Два кадра данных key1
увеличиваются с линейной скоростью, но может быть какая-то ошибка.
df1
key1 key2 key 3
0 1 2
20 3 4
40 5 6 <- this row
60 7 8
дф2
key1 key4 key5
0 9 10
20 11 12
39 13 14 <- this row
60 15 16
После слияния df1 и df2 результат должен быть:
df3
key1 key2 key3 key4 key5
0 1 2 9 10
20 3 4 11 12
40 5 6 13 14 <- this row
60 7 8 15 16
Значение, используемое для объединенного df в строке, должно быть целым числом, представляющим собой округленное среднее арифметическое.
Я попытался создать вложенный цикл for, проходящий через df1 и df2, и проверить значения в key1
, если разница в значении больше 1, я просто добавлю новую строку в df3 с nan
в отсутствующей части.
например:
некоторая строка в df1:
key1 key2 key 3
100 20 21
какая-то строка в df2:
key1 key4 key5
105 22 23
Что нужно добавить в df3:
key1 key2 key3 key4 key5
100 20 21 nan nan
105 nan nan 22 23
Этот подход очень медленный, и мой компьютер за ночь выполнил только 4% обработки.
pd.merge_asof
предназначался для этого:
df3 = pd.merge_asof(df1, df2, on='key1')
Выход:
>>> df3
key1 key2 key3 key4 key5
0 0 1 2 9 10
1 20 3 4 11 12
2 40 5 6 13 14
3 60 7 8 15 16
@StepBroBD не похоже. Но, я думаю, есть способ. Похоже, что merge_asof
использует key1
из первой df, поэтому мы можем просто выбрать строки из второй df, где key1
нет в объединенной df. df2[~df3['key1'].isin(df2['key1'])]
Спасибо за ответы! Это работало хорошо, но все еще есть некоторые проблемы: возможно ли, что
merge_asof()
может сохранять несопоставленные строки? Я проверил его документацию, но там ничего не указано.