首页 > 解决方案 > 如何根据先前索引处新创建的值执行计算?

问题描述

我有一个包含两列的数据集。一列是日期,第二列是多个指标。我想创建第三列(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

标签: pythonpandasfunctionif-statement

解决方案


  • 您正在尝试根据其先前的值创建列的值。
    • 矢量化操作根据现有值计算值,然后一次更新所有列值,因此无法访问新创建的先前值。
    • 为了根据前一个值执行计算,您必须在对当前值执行计算时访问前一个值
      • 这可以通过将每个值分配给列表然后访问前一个索引处的值来完成
  • 有关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

推荐阅读