我试图确定某一列连续多少天高于或低于特定阈值。
>>> df.head()
Open High Low Close Volume
Date
2004-08-19 49.96 51.98 47.93 50.12 NaN
2004-08-20 50.69 54.49 50.20 54.10 NaN
2004-08-23 55.32 56.68 54.47 54.65 NaN
2004-08-24 55.56 55.74 51.73 52.38 NaN
2004-08-25 52.43 53.95 51.89 52.95 NaN
>>>
对于上面的示例,我希望另一列 df['RDA'] 在 Open 列超过 50 的连续每一天递增。对于低于 50 的连续每一天,我希望第二列 df[ 'RDB'] 递增,df['RDA'] 重置为 0。我尝试过 if/then 逻辑,但它不喜欢那样,并给了我一个值错误:
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). how can i sort it out
我希望数据框的输出如下所示:
>>> df.head()
Open High Low Close Volume RDA RDB
Date
2004-08-19 51.96 51.98 47.93 50.12 NaN 1 0
2004-08-20 50.69 54.49 50.20 54.10 NaN 2 0
2004-08-23 55.32 56.68 54.47 54.65 NaN 3 0
2004-08-24 45.56 55.74 51.73 52.38 NaN 0 1
2004-08-25 42.43 53.95 51.89 52.95 NaN 0 2
2004-08-26 41.96 51.98 47.93 50.12 NaN 0 3
2004-08-27 40.69 54.49 50.20 54.10 NaN 0 4
2004-08-28 55.32 56.68 54.47 54.65 NaN 1 0
2004-08-29 55.56 55.74 51.73 52.38 NaN 2 0
2004-08-30 52.43 53.95 51.89 52.95 NaN 3 0
>>>
这对于 Pandas 来说是可能的吗?我知道您可以获取列中值的计数,但到目前为止我无法找到连续值的方法。带有 2 个变量的 if/then 语句可以工作,但就像我上面提到的那样,当我尝试这样做时,我得到了一个值错误。任何帮助将不胜感激。
最佳答案
首先,向数据框中添加一个标志列,以指示开盘价是否高于目标价格 50(True 或 False)。
然后,您可以使用compare-cumsum-groupby pattern识别此标志的累积分组并对每个此类组应用cumsum
。
我们现在需要反转标志,使 1 为零,0 为 1,然后使用相同的策略来计算 rdb
。
最后,我们删除 flag
列(我使用 .iloc[:, :-1]
删除它,因为我将其添加为最后一列)并附加新的 RDA
和 RDB
列。
target_price = 50
df = df.assign(flag=df.Open.gt(target_price)) # True if `Open` greater than `target_price`, otherwise False.
rda = df.groupby((df['flag'] != df['flag'].shift()).cumsum()).flag.cumsum()
df['flag'] = ~df['flag'] # Invert flag for RDB.
rdb = df.groupby((df['flag'] != df['flag'].shift()).cumsum()).flag.cumsum()
df = df.iloc[:, :-1].assign(RDA=rda, RDB=rdb)
>>> df
Date Open High Low Close Volume RDA RDB
0 8/19/04 51.96 51.98 47.93 50.12 NaN 1 0
1 8/20/04 50.69 54.49 50.20 54.10 NaN 2 0
2 8/23/04 55.32 56.68 54.47 54.65 NaN 3 0
3 8/24/04 45.56 55.74 51.73 52.38 NaN 0 1
4 8/25/04 42.43 53.95 51.89 52.95 NaN 0 2
5 8/26/04 41.96 51.98 47.93 50.12 NaN 0 3
6 8/27/04 40.69 54.49 50.20 54.10 NaN 0 4
7 8/28/04 55.32 56.68 54.47 54.65 NaN 1 0
8 8/29/04 55.56 55.74 51.73 52.38 NaN 2 0
9 8/30/04 52.43 53.95 51.89 52.95 NaN 3 0
关于python - 根据数据框中的另一个单元格值更改单元格值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45579613/