Есть ли в pandas функция для выполнения этой составной операции слияния с индексированием по времени?

#python #pandas #dataframe #nan

Вопрос:

У меня есть кадры данных, которые выглядят так,

df1 :

                           X1   X2   X3    X4
2021-02-23 15:44:20.100  NaN    0    1   Nan
2021-02-23 15:44:20.300  NaN    0    1   Nan
2021-02-23 15:44:20.500  NaN    0    1   Nan
2021-02-23 15:44:20.700  NaN    0    1   Nan
2021-02-23 15:44:20.900  NaN    0    1   Nan
2021-02-23 15:44:21.100  NaN    0    1   Nan
2021-02-23 15:44:21.300  NaN    0    1   Nan
2021-02-23 15:44:21.500  NaN    0    1   Nan
2021-02-23 15:44:21.700  NaN    0    1   Nan
2021-02-23 15:44:21.900  NaN    0    1   Nan
 

df2 :

                           X1   X2   X3    X4
2021-02-23 15:44:20.000    0    0    1   Nan
2021-02-23 15:44:20.200    3    0    1   Nan
2021-02-23 15:44:20.400  NaN    0    1   Nan
2021-02-23 15:44:20.600  NaN    0    1   Nan
2021-02-23 15:44:20.800  NaN    0    1     3
2021-02-23 15:44:21.000  NaN    0    1   Nan
2021-02-23 15:44:21.200  NaN    0    1     3
2021-02-23 15:44:21.400  NaN    0    1   Nan
2021-02-23 15:44:21.600  NaN    0    1     4
2021-02-23 15:44:21.800  NaN    0    1   Nan
2021-02-23 15:44:22.000  NaN    0    1   Nan
2021-02-23 15:44:22.200  NaN    0    1   Nan
2021-02-23 15:44:22.400  NaN    0    1   Nan
2021-02-23 15:44:22.600  NaN    0    1   Nan

 

Я хочу выполнить операцию слияния/объединения/объединения значений из столбцов левого фрейма данных (df1) в правый фрейм данных (df2). Это означало бы поиск временной шкалы по строкам в индексе времени и замену NAN, которые, возможно, уже существуют…

Интуиция: Что-то вроде merge_asof, но не создающего столбцы _x и _y, вместо этого заменяющего значения слева df справа.

Пожалуйста, обратите внимание:

  • Столбцы в правом фрейме данных всегда точно равны столбцам в левом фрейме данных.
  • В интуиции.. pandas.Dataframe.merge_asof() присоединяется ли левое соединение, но у меня другой случай, это больше похоже на внешнее соединение.

Результирующий объединенный/объединенный фрейм данных:

                           X1   X2   X3    X4
2021-02-23 15:44:20.100    0    0    1   Nan
2021-02-23 15:44:20.300    3    0    1   Nan
2021-02-23 15:44:20.500  NaN    0    1   Nan
2021-02-23 15:44:20.700  NaN    0    1   Nan
2021-02-23 15:44:20.900  NaN    0    1     3
2021-02-23 15:44:21.100  NaN    0    1   Nan
2021-02-23 15:44:21.300  NaN    0    1     3
2021-02-23 15:44:21.500  NaN    0    1   Nan
2021-02-23 15:44:21.700  NaN    0    1     4
2021-02-23 15:44:21.900  NaN    0    1   Nan
2021-02-23 15:44:22.000  NaN    0    1   Nan
2021-02-23 15:44:22.200  NaN    0    1   Nan
2021-02-23 15:44:22.400  NaN    0    1   Nan
2021-02-23 15:44:22.600  NaN    0    1   Nan
 

Что я пробовал:

  1. Один из методов, который я пробовал,-это повторное сравнение df1 и df2 с частотой, установленной как «T», что в основном гарантирует, что у обоих фреймов данных будут одинаковые ключи, если таковые имеются. Тогда выполнение соединений было бы прямым.
  • Проблема: При уменьшении df в панд по умолчанию отбрасываются строки NaN, и я не знаю способа, чтобы предотвратить это. Я не хочу удалять какие-либо данные … просто замените.
  1. merge_asof или традиционные слияния создают повторяющиеся столбцы с суффиксами, которые мне не нужны.
  2. присоединяйтесь и добавляйте просто добавляет строки из df2 в df1, что также не то, что я хочу.

То, что я предлагаю, может сработать:

  1. проверка второго кадра данных вручную для строки, синхронизирующей время, и повторение каждой строки. В моем случае это также невозможно, так как рассматриваемые фреймы данных очень велики.
 df1.shape -> (12200317 rows x 41 columns)
df2.shape -> (10000023 rows x 41 columns) 
 

У меня также есть несколько кадров данных, которые нужно просмотреть. (приблизительно 50)

Если есть какие-либо дубликаты этого вопроса .. Я не мог его найти.. Спасибо за любую помощь. 🙂

Комментарии:

1. Ни одна из меток метки времени индекса в df1 не соответствует df2. Можете ли вы привести более минималистичный, воспроизводимый пример с минимальным набором столбцов и минимальным набором строк и описать ввод и вывод, которые вы хотите.

2. «Ни одна из меток метки времени индекса в df1 не соответствует df2» Да, в этом и заключается суть вопроса. Это минимальный пример с определенным набором столбцов и строк, а также выводом. Тогда вопрос в том, как «воспроизвести» то, что есть в качестве вывода, программно с помощью панд. Я неправильно понял ваше замечание? Спасибо за ответ.

3. в минимальном примере не было бы фрейма данных с индексом длиной 14, и вам не нужны 4 столбца. Воспроизводимый пример будет содержать код, необходимый для построения ваших минимальных кадров данных. ваш результирующий фрейм данных, как указано, совпадает с df2, поэтому он не может быть вашим предполагаемым результатом. Извинись, если я полностью упущу суть, но если я это сделаю, я подозреваю, что и многие другие.

4. «в минимальном примере не было бы фрейма данных с индексом длиной 14, и вам не нужны 4 столбца».? Хорошо. «ваш результирующий кадр данных, как указано, совпадает с df2, так что это не может быть вашим предполагаемым результатом»- Нет, это не так. «Приношу извинения, если я полностью упускаю суть», Вы, ИМО