如何在熊猫中引用先前计算的行而不循环?

时间:2018-09-16 20:15:02

标签: python pandas apply

数据:

    day    cost    new_column
    1       1        0
    2       1        0
    3       5        enter position
    4       3        stay in position
    5       10       stay in position
    6       1        exit position
    7       1        0

您好,我想知道是否有一种方法可以在不循环和使用loc / iloc的情况下引用计算列中的上一行。在上面的示例中,我要计算此“ new_column”。一旦费用达到5,我想输入职位。一旦我处于头寸中,我希望能够在下一行上检查我是否已经处于头寸中,并检查价格是否为1。如果是,那么我将停留在该头寸中。我打到的第一行的成本为1,而上一个“ new_column”是“保持位置”,我想设为“退出位置”。然后,下一行为1的'new_column'应该回到零。

我现在要解决的方法是遍历每一行,查看第i行的成本和第i-1行的new_column的状态,然后将结果插入第i行的new_column中。

这需要花费大量时间处理大型数据集,我想找到一种更有效的处理方法。我查看了list(map()),但没有看到引用上一行的方法,因为我认为尚未创建要引用的数据。有什么想法吗?

谢谢

1 个答案:

答案 0 :(得分:2)

嘿,因为smj建议一种选择是使用shift。

day = list(range(1,8))
cost = [1,1,5,3,10,1,1]

import pandas as pd
import numpy as np

df = pd.DataFrame({'day':day,'cost':cost}, columns = ['day', 'cost'])
print(df)
df['new'] = np.where(df['cost']> 1, np.where(
                                             df['cost'].shift(-1) >=1,
                                             'stay','a'
                                            ),
                     np.where(
                              df['cost'].shift()>1, 'exit', 0
                             )
                    )
print(df)