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
我的挑战是想出一个逻辑,其中收入和传出列(当前为空)应该具有(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 天有两个相似的价格。
解决方案
我会分别计算产品和掩码,然后更新列:
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
推荐阅读
- java - mvvmFX 在 Maven 项目中找不到 FXML 文件
- python - PyQt+Socket - 为 GUI 服务器的多线程客户端运行循环
- ruby-on-rails - Rails 错误消息显示太多细节
- javascript - Shopify 检索有关特定产品的数据
- c++ - 如何枚举远程计算机上的卷?
- javascript - 开玩笑防止节点模块被导入
- visual-studio-2019 - Visual Studio 2019 发布(或从服务器替换)单个选定文件不可用
- python - 如何通过 Pandas 中的循环加入多个 DataFrame?
- file - 我无法通过 Flywheel 从本地加载 WordPress
- r - 无法在 R Shiny 中使用 renderDT 修复第一列?