在数据框行上使用apply()而不是迭代

时间:2019-04-22 16:04:03

标签: python pandas loops

我具有以下数据框,并且我正在尝试计算指标:

    Date    saldo
0   2018-01-02  94.0
1   2018-01-03  92.0
2   2018-01-04  90.0
3   2018-01-06  86.0
4   2018-01-07  84.0
5   2018-01-08  82.0
6   2018-01-09  80.0
7   2018-01-11  76.0
8   2018-01-12  72.0
9   2018-01-13  70.0

我使用了iterrows方法,并且正常工作,返回了预期的输出。

data = 0
n = 0
c= 0
V=0
recompra = 35
qtd = 40
leadtime = 10

Data = []
Valor = []

for index, row in dk.iterrows():

    if (row['saldo'] + c) < recompra:
        data += 1
        V = row['saldo'] + c

    if data == leadtime:

        n += 1
        c = qtd * n
        data = 0

    else:
        V = row['saldo'] + c

df = pd.DataFrame(list(zip(Data, Valor)), columns=['Data', 'Valor'])

当我尝试使用apply()应用相同的方法时,它起作用了,但是,它从“ saldo”列返回了相同的输出。

def optimize(row):
    data = 0
    n = 0
    c= 0
    recompra = 35
    qtd = 40
    leadtime = 10

    if (row['saldo'] + c) < recompra:
        data += 1
        return row['saldo'] + c

    if data == leadtime:
        n += 1
        c = (qtd) * n
        data = 0

    else:
        return row['saldo'] + c

df['Simular'] = df.apply(optimize, axis=1)

我从第二种方法中得到的是同一列的副本:

Date    saldo   Simulado
0   2018-01-02  94.0    94.0
1   2018-01-03  92.0    92.0
2   2018-01-04  90.0    90.0
3   2018-01-06  86.0    86.0
4   2018-01-07  84.0    84.0
5   2018-01-08  82.0    82.0
6   2018-01-09  80.0    80.0
7   2018-01-11  76.0    76.0
8   2018-01-12  72.0    72.0
9   2018-01-13  70.0    70.0

1 个答案:

答案 0 :(得分:0)

您应用的函数始终返回row ['saldo'] + c,因为数据==提前期永远不会为真。当c等于0时,您的代码似乎行为正确;将['saldo']列的副本附加为['Simular']。

如果要获得不同的结果,则应更改变量或语句。