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)