Я пытаюсь реализовать простую функцию, которая позволит мне вернуться назад, чтобы найти ненулевое значение, и это значение будет сохранено в новом столбце с именем prv_djma.
Данные
data = {'id_st': [100, 100, 100, 100, 100, 100, 100, 100, 100],
'year': [2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018],
'djma': [1000, 2200, 0, 3000, 1000, 0, 2000, 0, 0],
'taux': [np.nan, 0.9, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 0.7]}
df = pd.DataFrame(data)
df
df['prv_djma'] = df['djma'].shift()
Что я ищу
Цель состоит в том, чтобы проверить N строк назад, пока не будет найдено ненулевое значение djma, а затем поместить значение в текущую строку (столбец prv_djma).
Например, последняя строка с (индекс 8) имеет djma = 0, а (индекс 7) также djma = 0, поэтому я хочу заполнить столбец prv_djma с помощью djma (индекс 6).
Примечание
Проблема у меня в индексе 8. все остальные строки правильные.
@ cs95 Я пытаюсь перефразировать свой вопрос, чтобы всем было понятно. Извините, если это вызывает проблемы
@adilblanco, во-первых, пожалуйста, опубликуйте данные в виде текста (без изображений пожалуйста), во-вторых, вопрос не очень ясен, можете ли вы объяснить логику немного подробнее? Спасибо
@anky_91 anky_91 Я обновил свой вопрос, надеюсь, теперь все понятно. Спасибо
Что бы вы хотели, чтобы в первых трех строках было 0 для djma? Должен ли вывод быть NaN NaN NaN 0 3000
для первых 5 строк?
@ALollz Спасибо за ответ. Моя конечная цель состоит в том, чтобы, когда у меня нет djma в течение года, я мог использовать тот, что был в предыдущие годы (ближайший год).
Это shift
, гарантирующее, что если есть последовательные 0, мы затем заполним предыдущее значение:
m = df.djma.eq(0)
df['prv_djma'] = df.djma.shift().mask((m == m.shift()) & m).ffill()
id_st year djma taux prev_djma
0 100 2010 1000 NaN NaN
1 100 2011 2200 0.9 1000.0
2 100 2012 0 1.1 2200.0
3 100 2013 3000 1.2 0.0
4 100 2014 1000 1.3 3000.0
5 100 2015 0 1.4 1000.0
6 100 2016 2000 1.5 0.0
7 100 2017 0 1.6 2000.0
8 100 2018 0 0.7 2000.0
Для групп это нужно делать отдельно, чтобы .shift
не вылилось за пределы группы.
def get_prv(x):
m = x.eq(0)
return x.shift().mask((m == m.shift()) & m).ffill()
df['prv_djma'] = df.groupby('id_st')['djma'].apply(get_prv)
Спасибо за ответ, в моем случае у меня много ['id_st'], я пробовал с groupby df['prv_djma'] = df.groupby('id_st')['djma'].shift().mask((m == m.shift()) & m).ffill()
, но не работает ни одно предложение
@adilblanco Посмотрите мое обновление, сделайте его функцией, а затем подайте заявку на groupby.
Вы нажали «Отправить» до того, как закончили свой пост, или это все, что у вас есть?