python - 具有累积值的新 Pandas 列取决于上一行的条件
问题描述
我有以下数据框,它由三列组成:values、cumsum、ema。
import pandas as pd
import numpy as np
col_values = [-36.0,
1.5,
-13.200000000000273,
32.79999999999973,
11.69999999999959,
31.59999999999991,
52.0,
-1.1999999999995907,
52.0,
-105.29999999999973,
-3.299999999999727,
-14.100000000000136,
9.599999999999454,
-90.89999999999986,
0.0,
33.40000000000009,
-12.900000000000546,
39.09999999999991,
32.80000000000018,
15.299999999999727,
-33.0,
-15.599999999999454,
11.700000000000273,
12.600000000000136,
-6.0]
col_cumsum = [1717.6999999999982,
1719.1999999999982,
1705.999999999998,
1738.7999999999977,
1750.4999999999973,
1782.0999999999972,
1834.0999999999972,
1832.8999999999976,
1884.8999999999976,
1779.5999999999979,
1776.2999999999981,
1762.199999999998,
1771.7999999999975,
1680.8999999999976,
1680.8999999999976,
1714.2999999999977,
1701.3999999999971,
1740.499999999997,
1773.2999999999972,
1788.599999999997,
1755.599999999997,
1739.9999999999975,
1751.6999999999978,
1764.299999999998,
1758.299999999998]
col_ema = [1754.3539071732214,
1751.0059160138665,
1746.71963829826,
1745.965387031759,
1746.3972549334958,
1749.7975163684007,
1757.8263243333147,
1764.9761982063321,
1776.3975126628718,
1776.702511456884,
1776.6641770324188,
1775.2866363626642,
1774.9545757566962,
1765.9969971132011,
1757.892521197658,
1753.7408525121668,
1748.75600941577,
1747.969722804744,
1750.3821301566725,
1754.0219272846084,
1754.1722199241694,
1752.8224846932958,
1752.7155813891723,
1753.8188593521081,
1754.2456346519073]
df1 = pd.DataFrame({'values': col_values, 'cumsum': col_cumsum, 'ema': col_ema})
df1.head(50)
如果在上一行中“cumsum”的值等于或大于“ema”,我想创建一个新列,该列添加累积“值”列。
我试过这个:
df1['equity_cond'] = np.where(df1['cumsum'].shift(1)>=df1['ema'].shift(1), df1['equity_cond'].shift(1) + df1['values'], df1['equity_cond'].shift(1))
这会产生以下错误:
KeyError: 'equity_cond'
During handling of the above exception, another exception occurred:
KeyError Traceback (most recent call last)
<ipython-input-25-1c89c1e1113c> in <module>
----> 2 df1['equity_cond'] = np.where(df1['cumsum'].shift(1)>=df1['ema'].shift(1), df1['equity_cond'].shift(1) + df1['values'], df1['equity_cond'].shift(1))
如何在 Pandas 中实现这一点?
编辑:
此新列的预期值为:
0
0
0
0
0
31.6
83.6
…
解决方案
您可以将['values']
列乘以条件,这样当您应用时.cumsum()
,它会为不满足条件的行加上 0,以及满足条件['values']
时的列值。
cond = df1['cumsum'].shift() >= df1['ema'].shift()
df1['x'] = np.where(cond,
(df1['values'] * cond).cumsum(),
0)
这似乎给出了您正在寻找的结果:
values cumsum ema x
0 -36.0 1717.7 1754.353907 0.0
1 1.5 1719.2 1751.005916 0.0
2 -13.2 1706.0 1746.719638 0.0
3 32.8 1738.8 1745.965387 0.0
4 11.7 1750.5 1746.397255 0.0
5 31.6 1782.1 1749.797516 31.6
6 52.0 1834.1 1757.826324 83.6
7 -1.2 1832.9 1764.976198 82.4
8 52.0 1884.9 1776.397513 134.4
9 -105.3 1779.6 1776.702511 29.1
10 -3.3 1776.3 1776.664177 25.8
推荐阅读
- textures - 如何在 MTKView 中渲染 CGImage,同时保持合理的色彩空间映射?
- html - Bootstrap 的网格布局没有将图像定位到文本的右侧。我试过`img-fluid`但没用
- html - 切换开关(HTML + CSS)工作/不工作
- node.js - 在猫鼬中将项目推送到具有数组属性的对象数组中
- python - 为什么 wxPython 没有安装
- javascript - 使用 setAttribute() 将 onkeyup 函数添加到函数中带有文本参数的 DOM 元素
- c++ - 如何在模板中转发通用结构的初始化参数?
- c - 根据 C 标准,int 的大小是多少?
- c++ - Why is my struct constructor, which contains other structs, not working?
- python - 关于 python 上 sort() 方法的一些问题