Как выполнить расчет на основе вновь созданного значения по предыдущему индексу? - PullRequest
0 голосов
/ 09 июля 2020

У меня есть набор данных с двумя столбцами. Один столбец - это даты, а второй - несколько метрич. c. Я хочу создать третий столбец (New_Col), который смотрит на текущее кратное и ранее созданное значение и умножает их. Таким образом, первый будет

Date           Multiple   
01-01-2020        1          
01-01-2020        1         
01-01-2020        3          
01-01-2020        1          
01-01-2020        1          
01-01-2020        1          
01-01-2020        4          
01-01-2020        1  

Функция:

def new_func(df):

Вывод

Date           Multiple   New_Col
01-01-2020        1          1
01-01-2020        1          1
01-01-2020        3          3
01-01-2020        1          3
01-01-2020        1          3
01-01-2020        1          3
01-01-2020        4          12
01-01-2020        1          12

1 Ответ

0 голосов
/ 09 июля 2020
  • Вы пытаетесь создать значение столбца на основе его предыдущего значения.
    • Векторизованные операции вычисляют значения на основе существующих значений, а затем обновляют значения столбцов сразу, поэтому нет способа получить доступ к вновь созданному предыдущему значению.
    • Для выполнения вычисления на основе предыдущего значения у вас должен быть доступ к предыдущему значению при выполнении вычисления для текущего значения
      • Это можно сделать, присвоив каждое значение списку, а затем получив доступ к значению по предыдущему индексу
  • Подробнее об использовании см. pandas.DataFrame.iterrows.
  • Следующая реализация работает, пока индекс фрейма данных range(0, len(df)-1), уникальный упорядоченные целые числа, начинающиеся с 0.
    • Потому что df индекс i используется для адреса new_col
import pandas as pd

data = {'Date': ['01-01-2020', '01-01-2020', '01-01-2020', '01-01-2020', '01-01-2020', '01-01-2020', '01-01-2020', '01-01-2020'],
        'Multiple': [1, 1, 3, 1, 1, 1, 4, 1]}

# create dataframe
df = pd.DataFrame(data)

# function to perform multiplication
def create_new_column(dataframe: pd.DataFrame) -> list:
    new_col = list()
    for i, (d, m) in df.iterrows():  # i is the current index location; based on the shape of the example dataframe
        if i == 0:
            new_col.append(m * 1)
        else:
            new_col.append(m * new_col[i-1])  # [i-1] previous index location
    return new_col


# call function and create new_col
df['new_col'] = create_new_column(df)

# display(df)
         Date  Multiple  new_col
0  01-01-2020         1        1
1  01-01-2020         1        1
2  01-01-2020         3        3
3  01-01-2020         1        3
4  01-01-2020         1        3
5  01-01-2020         1        3
6  01-01-2020         4       12
7  01-01-2020         1       12
...