首页 > 解决方案 > 使用前一行的值创建新的 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  

我的挑战是想出一个逻辑,其中收入和传出列(当前为空)应该具有(Vol * Price)的值。

但是,当前一天的“价格”值低于当前值时,收入列应该带有这个值。当前一天的“价格”值高于当前值时,Outgoing 列应携带此值。收入和支出列的其余部分应该只有 NaN。如果价格不变,则当天的价值将被删除。

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

我曾尝试在我的代码示例中使用 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']

但它不起作用。

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

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

在此处输入图像描述

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

标签: pythonpandas

解决方案


我会分别计算产品和掩码,然后更新列:

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

推荐阅读