[英]pandas dataframe conditional population of a new column
我正在处理 pandas DataFrame 中的列(趋势)。下面是我的源 DataFrame。目前我已将其设置为 0。
我想用来填充趋势列的逻辑如下
如果 df['Close'] > df.shift(1)['Down'] 那么 1
如果 df['Close'] < df.shift(1)['Up'] 那么 -1
如果上述任何一个条件不满足,则 df.shift(1)['Trend']。 如果此值为 NaN,则将其设置为 1。
以上纯文本代码,
更新
文本形式的数据
Close Up Down Trend
3.138 NaN NaN 0
3.141 NaN NaN 0
3.141 NaN NaN 0
3.130 NaN NaN 0
3.110 NaN NaN 0
3.130 3.026432 3.214568 0
3.142 3.044721 3.214568 0
3.140 3.047010 3.214568 0
3.146 3.059807 3.214568 0
3.153 3.064479 3.214568 0
3.173 3.080040 3.214568 0
3.145 3.080040 3.214568 0
3.132 3.080040 3.214568 0
3.131 3.080040 3.209850 0
3.141 3.080040 3.209850 0
3.098 3.080040 3.205953 0
3.070 3.080040 3.195226 0
预计 output
根据满足的条件,我们可以使用numpy.select
到 select 的值。 然后将numpy.select
的结果传递给fillna
以用它填充缺失的“趋势”值(这用于不丢失现有的“趋势”值)。 然后由于 NaN 趋势值必须用之前的“趋势”值填充,我们使用ffill
并用 1 填充剩余的 NaN 值。
import numpy as np
df['Trend'] = (df['Trend'].replace(0, np.nan)
.fillna(pd.Series(np.select([df['Close'] > df['Down'].shift(),
df['Close'] < df['Up'].shift()],
[1, -1], np.nan), index=df.index))
.ffill().fillna(1))
Output:
Close Up Down Trend
0 3.138 NaN NaN 1.0
1 3.141 NaN NaN 1.0
2 3.141 NaN NaN 1.0
3 3.130 NaN NaN 1.0
4 3.110 NaN NaN 1.0
5 3.130 3.026432 3.214568 1.0
6 3.142 3.044721 3.214568 1.0
7 3.140 3.047010 3.214568 1.0
8 3.146 3.059807 3.214568 1.0
9 3.153 3.064479 3.214568 1.0
10 3.173 3.080040 3.214568 1.0
11 3.145 3.080040 3.214568 1.0
12 3.132 3.080040 3.214568 1.0
13 3.131 3.080040 3.209850 1.0
14 3.141 3.080040 3.209850 1.0
15 3.098 3.080040 3.205953 1.0
16 3.070 3.080040 3.195226 -1.0
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.