使用上一行的值创建新的Pandas列

时间:2019-05-24 22:05:28

标签: python pandas

我需要使用上一行的逻辑和值来创建两个新的Pandas列。

我有以下数据:

Day Vol    Price    Income   Outgoing
1   499     75      
2   3233    90      
3   1812    70      
4   2407    97      
5   3474    82      
6   1057    53      
7   2031    68      
8   304     78      
9   1339    62      
10  2847    57      
11  3767    93      
12  1096    83      
13  3899    88      
14  4090    63      
15  3249    52      
16  1478    52      
17  4926    75      
18  1209    52      
19  1982    90      
20  4499    93  

我的挑战是提出一个逻辑,其中“收入”和“支出”列(当前为空)都应具有(体积*价格)的值。

但是,当前一天的“价格”值低于当前值时,收入列应带有此值。当前一天的“价格”值高于当前值时,“支出”列应带有此值。其余“收入”和“支出”列应仅包含NaN。如果价格保持不变,则该天的价值将被删除。

但是整个逻辑应从(n + 1)天开始。应该跳过第一行,并且逻辑应该从第二行开始应用。

我尝试在代码示例中使用shift:

if sample_data['Price'].shift(1) < sample_data['Price'].shift(2)):
    sample_data['Income'] = sample_data['Vol'] * sample_data['Price']
else:
    sample_data['Outgoing'] = sample_data['Vol'] * sample_data['Price']

但是它不起作用。

我觉得有一个更简单,更全面的策略可以解决这个问题,有人可以帮忙吗?

更新(最终输出应如下所示):

enter image description here

对于第16天,数据被删除,因为我们在第15天和第16天有两个相似的价格。

1 个答案:

答案 0 :(得分:1)

我将分别计算乘积和面罩,然后更新列数:

In [11]: vol_price = df["Vol"] * df["Price"]

In [12]: incoming = df["Price"].diff() < 0

In [13]: df.loc[incoming, "Income"] = vol_price

In [14]: df.loc[~incoming, "Outgoing"] = vol_price

In [15]: df
Out[15]:
    Day   Vol  Price    Income  Outgoing
0     1   499     75       NaN   37425.0
1     2  3233     90       NaN  290970.0
2     3  1812     70  126840.0       NaN
3     4  2407     97       NaN  233479.0
4     5  3474     82  284868.0       NaN
5     6  1057     53   56021.0       NaN
6     7  2031     68       NaN  138108.0
7     8   304     78       NaN   23712.0
8     9  1339     62   83018.0       NaN
9    10  2847     57  162279.0       NaN
10   11  3767     93       NaN  350331.0
11   12  1096     83   90968.0       NaN
12   13  3899     88       NaN  343112.0
13   14  4090     63  257670.0       NaN
14   15  3249     52  168948.0       NaN
15   16  1478     52       NaN   76856.0
16   17  4926     75       NaN  369450.0
17   18  1209     52   62868.0       NaN
18   19  1982     90       NaN  178380.0
19   20  4499     93       NaN  418407.0

还是这样:

In [21]: incoming = df["Price"].diff() > 0

In [22]: df.loc[incoming, "Income"] = vol_price

In [23]: df.loc[~incoming, "Outgoing"] = vol_price

In [24]: df
Out[24]:
    Day   Vol  Price    Income  Outgoing
0     1   499     75       NaN   37425.0
1     2  3233     90  290970.0       NaN
2     3  1812     70       NaN  126840.0
3     4  2407     97  233479.0       NaN
4     5  3474     82       NaN  284868.0
5     6  1057     53       NaN   56021.0
6     7  2031     68  138108.0       NaN
7     8   304     78   23712.0       NaN
8     9  1339     62       NaN   83018.0
9    10  2847     57       NaN  162279.0
10   11  3767     93  350331.0       NaN
11   12  1096     83       NaN   90968.0
12   13  3899     88  343112.0       NaN
13   14  4090     63       NaN  257670.0
14   15  3249     52       NaN  168948.0
15   16  1478     52       NaN   76856.0
16   17  4926     75  369450.0       NaN
17   18  1209     52       NaN   62868.0
18   19  1982     90  178380.0       NaN
19   20  4499     93  418407.0       NaN