Как сгенерировать недостающие добавочные значения строк в фрейме данных с помощью Pandas?

#python-3.x #pandas

#python-3.x #pandas

Вопрос:

У меня есть фрейм данных с двумя столбцами, пройденными секундами и значением. В строке пройденных секунд фрейм данных иногда пропускает секунду (данные отсутствуют). Я хотел бы заполнить недостающие секунды и интерполировать недостающее значение.

То, что я пробовал до сих пор, — это выполнить первое и последнее измерение фрейма данных и создать массив Numpy, содержащий все секунды, прошедшие от начала до конца, преобразовал это в фрейм данных, соответствующий первому, и попытался объединить или объединить их.

Исходный df выглядит так:

    seconds   value
0     1        5.560000
1     3        5.590000
2     4        5.620000
3     5        5.646667
4     7        5.653333
5     9        5.760000
  

Затем я создаю другой фрейм данных df2:

    seconds   value
0     1        NaN
1     2        NaN
2     3        NaN
3     4        NaN
4     5        NaN
5     6        NaN
6     7        NaN
7     8        NaN
8     9        NaN
  

Я попытался объединить их вместе, в обоих направлениях примерно так

 df = df.merge(df2, how='left')
  

Я ожидаю, что результат будет

    seconds   value
0     1        5.560000
1     2        NaN
2     3        5.590000
3     4        5.620000
4     5        5.646667
5     6        NaN
6     7        5.653333
7     8        NaN
8     9        5.760000
  

но фактический результат — либо df, либо df2, без объединения. Есть ли способ достичь ожидаемого результата, и я на правильном пути или это можно сделать намного проще?

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

1. Попробуйте df.merge(df2, how='outer') . Внешнее слияние : «используйте объединение ключей из обоих фреймов, аналогично полному внешнему соединению SQL; сортируйте ключи лексикографически».

Ответ №1:

Вам не нужен второй df, используйте df.reindex() :

 df=df.set_index('seconds')
df=df.reindex(range(df.index.min(),df.index.max() 1)).reset_index()
  

Если необходимо использовать второй df, вы можете использовать:

 df=df.set_index('seconds').combine_first(df2.set_index('seconds')).reset_index()
  

    seconds     value
0        1  5.560000
1        2       NaN
2        3  5.590000
3        4  5.620000
4        5  5.646667
5        6       NaN
6        7  5.653333
7        8       NaN
8        9  5.760000
  

Ответ №2:

Я использую update и решаю вашу проблему

 df1.set_index('seconds',inplace=True)
df2.set_index('seconds',inplace=True)
df2.update(df1)
df2.reset_index(inplace=True)
  

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

1. Оба ответа работают, принят первый ответ для устранения необходимости иметь промежуточный фрейм данных.