pandas добавить строки по условию

Нужно добавить строки в датафрейм, если в колонке price разница в значениях больше 1 , в новой строке написать 'пропущенные' цены(то есть шаг цены должен быть единица). Остальные ячейки заполнить нулями. Задачу решил но как мне кажется должен быть более элегантный способ:

def new_price(x): # Ф-ция получает построчно значения из price и diff_pr
    if x.iloc[0] > 1: # Если разница между ценами больше 1
        incr = 1
        for i in range(x.iloc[0] - 1): # Количество строк которые нужно добавить из ходя из разницы между price
            df.loc[len(df)] = [0, x.iloc[1] + incr, 0] # Обращаемся к price на строке в которой найдена разница более 1
            incr += 1                                  # Добавляем новую строку где price +1


df = pd.DataFrame({'vol': [2, 3, 8], 'price': [5, 3, 10]}).sort_values(by='price', ascending=False)
df['diff_pr'] = df['price'].diff().fillna(0).abs().astype('int')
df[['diff_pr', 'price']].apply(new_price, axis=1)
df = df.sort_values(by='price', ascending=False)
print(df)

ответ:

   vol  price  diff_pr
2    8     10        0
6    0      9        0
5    0      8        0
4    0      7        0
3    0      6        0
0    2      5        5
7    0      4        0
1    3      3        2

Ответы (2 шт):

Автор решения: Алексей Р

Без колонки diff_pr - она вроде бы не нужна, вспомогательная.
Создаем серию чисел через range с минимума по максимум из прайса, мерджим с фреймом через outer, NaNы заменяем нулями, сортируем.

df = pd.DataFrame({'vol': [2, 3, 8], 'price': [5, 3, 10]})
df = (df.merge(pd.Series(range(df.price.min(), df.price.max())).rename('price'), how='outer')
      .fillna(0).astype(int).sort_values(by='price', ascending=False).reset_index(drop=True))
print(df)
   vol  price
0    8     10
1    0      9
2    0      8
3    0      7
4    0      6
5    2      5
6    0      4
7    3      3
→ Ссылка
Автор решения: strawdog

Смысл, в общем, такой же, что и у ответа от @Алексей Р, но через индексы и без мерджинга. Мне кажется, так будет быстрее. но это не точно

df = df.set_index("price")
df = df.reindex(range(df.index.max(), df.index.min()-1,-1)).reset_index().fillna(0).astype(int)
→ Ссылка