Заменить столбец некоторыми строками другого столбца

У меня есть следующий фрейм данных:

midPrice    Change %  Spike  New Oilprice
92.20000    0.00      0      92.043405 
92.26454    0.07      0      92.049689
91.96950    -0.32     0      91.979751
91.73958    -0.25     0      91.844369
91.78985    0.05      0      91.724690
91.41000    -0.41     0      91.568880
91.18148    -0.25     0      91.690812
91.24257    0.07      0      91.858391
90.95352    -0.32     0      92.016806 
93.24000    2.51      1      92.139872
93.31013    0.08      0      92.321622
93.00690    -0.32     0      92.542687
92.77438    -0.25     0      92.727070
92.86400    0.10      0      92.949655

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

Любые идеи, как это решить? Я попробовал код на основе следующего:

  1. Итерация через df (для цикла)
  2. Утверждение if/else если всплеск == 1, то замените следующие 5 строк значениями новых цен на нефть / иначе: сохранить цены на нефть
def spike(i):   
 
    for i in df['Spike']: 
         if i.loc == 1: 
              df['midPrice'].replace(df['New Oilprice'][i:5])`

К сожалению, это не работает, и я не так силен в пандах. Я также попытался сопоставить функцию с фреймом данных, но это тоже не сработало. Буду признателен за любую помощь

Пожалуйста, опубликуйте пример фрейма данных в виде текста (и ожидаемого результата) вместо снимка экрана.

user2246849 17.05.2022 11:40

Даже если лучше, это все равно скриншот. Вы действительно можете просто скопировать содержимое фрейма данных в виде текста и вставить его в вопрос внутри блока кода. Также глянь сюда

user2246849 17.05.2022 11:49

Что должно произойти, если в течение пяти пяти дней произойдет два всплеска? Заменяет ли первый выброс следующие пять строк, но затем второй выброс использует 1/свое старое значение или 2/свое новое, замененное значение для следующих пяти рядов? Или что-то совсем другое?

9769953 17.05.2022 11:49

Если вы используете вывод f"DataFrame({df.to_dict()}) (без окружающих кавычек и аккуратно отформатированный с разрывами строк), мы можем легко скопировать и вставить пример фрейма данных.

9769953 17.05.2022 11:51
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения текстовых сообщений может быть настолько сложным или простым, насколько вы его сделаете. Как и в любом ML-проекте, вы можете выбрать...
7 лайфхаков для начинающих Python-программистов
7 лайфхаков для начинающих Python-программистов
В этой статье мы расскажем о хитростях и советах по Python, которые должны быть известны разработчику Python.
Установка Apache Cassandra на Mac OS
Установка Apache Cassandra на Mac OS
Это краткое руководство по установке Apache Cassandra.
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
В одном из недавних постов я рассказал о том, как я использую навыки количественных исследований, которые я совершенствую в рамках программы TPQ...
Создание персонального файлового хранилища
Создание персонального файлового хранилища
Вы когда-нибудь хотели поделиться с кем-то файлом, но он содержал конфиденциальную информацию? Многие думают, что электронная почта безопасна, но это...
Создание приборной панели для анализа данных на GCP - часть I
Создание приборной панели для анализа данных на GCP - часть I
Недавно я столкнулся с интересной бизнес-задачей - визуализацией сбоев в цепочке поставок лекарств, которую могут просматривать врачи и...
1
4
47
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Предполагая, что df отсортирован по времени в порядке возрастания (как я видел в истории редактирования вашего вопроса, у вас есть столбец времени), вы можете использовать такую ​​​​маску:

mask = df['Spike'].eq(1).where(df['Spike'].eq(1)).fillna(method='ffill', limit=4).fillna(False)
df.loc[mask, 'midPrice'] = df['New Oilprice']

print(df)
     midPrice  Change %  Spike  New Oilprice
0   92.200000      0.00      0     92.043405
1   92.264540      0.07      0     92.049689
2   91.969500     -0.32      0     91.979751
3   91.739580     -0.25      0     91.844369
4   91.789850      0.05      0     91.724690
5   91.410000     -0.41      0     91.568880
6   91.181480     -0.25      0     91.690812
7   91.242570      0.07      0     91.858391
8   90.953520     -0.32      0     92.016806
9   92.139872      2.51      1     92.139872
10  92.321622      0.08      0     92.321622
11  92.542687     -0.32      0     92.542687
12  92.727070     -0.25      0     92.727070
13  92.949655      0.10      0     92.949655

РЕДАКТИРОВАТЬ - 2 строки до, 3 строки после:

Вы можете настроить маску с помощью другого fillna:


mask = df['Spike'].eq(1).where(df['Spike'].eq(1)).fillna(method='bfill', limit=2).fillna(method='ffill', limit=3).fillna(False)
df.loc[mask, 'midPrice'] = df['New Oilprice']
​
print(df)
     midPrice  Change %  Spike  New Oilprice
0   92.200000      0.00      0     92.043405
1   92.264540      0.07      0     92.049689
2   91.969500     -0.32      0     91.979751
3   91.739580     -0.25      0     91.844369
4   91.789850      0.05      0     91.724690
5   91.410000     -0.41      0     91.568880
6   91.181480     -0.25      0     91.690812
7   91.858391      0.07      0     91.858391
8   92.016806     -0.32      0     92.016806
9   92.139872      2.51      1     92.139872
10  92.321622      0.08      0     92.321622
11  92.542687     -0.32      0     92.542687
12  92.727070     -0.25      0     92.727070
13  92.949655      0.10      0     92.949655

Отлично спасибо! Это работает. Могу ли я также настроить его, чтобы сделать его на 2 ряда раньше и на 3 ряда позже после шипа? Буду ли я делать это с индексацией?

Helene 17.05.2022 12:05

@ Элен, ты имеешь в виду вот так? 2 ряда + ряд с шипами + 3 ряда после? всего 6 рядов включая шип?

user2246849 17.05.2022 12:08

@Helene, проверьте мое редактирование, чтобы убедиться, что вы это имели в виду.

user2246849 17.05.2022 12:10

Да, большое спасибо. Вы избавили меня от ручной работы :)

Helene 17.05.2022 12:19

@Элен, без проблем! Ах, не забудьте отсортировать df по времени (по возрастанию). Я также добавлю это к своему ответу

user2246849 17.05.2022 12:31

Другие вопросы по теме