В кадре данных pandas для данного столбца: как умножить значение в той же строке df на другое значение в предыдущей строке собственного столбца?

Я хочу преобразовать такой фрейм данных

date     |     colA     |       ColB
------------------------------------
1971-10-01   0.002451            NaN
1971-11-01   0.002445            NaN
1971-12-01   0.002439            NaN
1972-01-01   0.002433            NaN
1972-02-01   0.004854            NaN
1972-03-01   0.000000    250341816.0
1972-04-01   0.002415            NaN
1972-05-01   0.002410            NaN
1972-06-01   0.002404            NaN

к

date     |     colA     |       ColB
------------------------------------
1971-10-01   0.002451            0
1971-11-01   0.002445            0
1971-12-01   0.002439            0
1972-01-01   0.002433            0
1972-02-01   0.004854            0
1972-03-01   0.000000    250341816.0
1972-04-01   0.002415    250946391.486
1972-05-01   0.002410    251551172.289
1972-06-01   0.002404    252155901.307

В colB было только одно допустимое значение, т. е. 250341816.0, а остальные все строки были NaN, строки над ним должны быть заполнены 0, а i-я строка ниже должна быть заполнена

df[ColB].iloc[i] = df[ColB].iloc[i-1] * (1 + df[ColA].iloc[i])

например, как вы можете видеть 250341816.0*(1+0.002415)=250946391.486

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

Короче говоря - нельзя, это должен быть цикл :) stackoverflow.com/questions/38008390/…

Georgina Skibinski 04.08.2024 14:01

Выглядит просто как кампрод colA + 1

Quang Hoang 04.08.2024 14:49
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Код

cond = df['colB'].shift().isna().cummin()

df['colB'] = (
    df['colA']
    .mask(cond, 0)
    .add(1)
    .cumprod()
    .mul(df['colB'].ffill(), fill_value=0)
)

дф

         date     colA             colB
0  1971-10-01 0.002451         0.000000
1  1971-11-01 0.002445         0.000000
2  1971-12-01 0.002439         0.000000
3  1972-01-01 0.002433         0.000000
4  1972-02-01 0.004854         0.000000
5  1972-03-01 0.000000 250341816.000000
6  1972-04-01 0.002415 250946391.486000
7  1972-05-01 0.002410 251551172.289000
8  1972-06-01 0.002404 252155901.307000

Пример кода

import pandas as pd
data = {'date': ['1971-10-01', '1971-11-01', '1971-12-01', '1972-01-01', '1972-02-01', '1972-03-01', '1972-04-01', '1972-05-01', '1972-06-01'], 'colA': [0.002451, 0.002445, 0.002439, 0.002433, 0.004854, 0.0, 0.002415, 0.00241, 0.002404], 'colB': [float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), 250341816.0, float('nan'), float('nan'), float('nan')]}
df = pd.DataFrame(data)

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