python - 根据数据框中的另一个单元格值更改单元格值

标签 python python-3.x pandas

我试图确定某一列连续多少天高于或低于特定阈值。

>>> 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] 删除它,因为我将其添加为最后一列)并附加新的 RDARDB 列。

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/

相关文章:

python - Flask:是否应该将我自己的配置添加到 app.config 中?

python - PyCharm 项目文件消失了

python - 根据任何列值从数据框中删除行

python - 使用 InterX 函数转换为 python 时出现模块错误

c++ - 语言间自动编译

python - Django如何生成uuid?

python - 客户端使用 Python3 连接到 sybase IQ

regex - 替换字符串中的表情符号会导致奇数字符

python-3.x - 如何删除具有相同值的行?合并具有相同前缀的列

python - 比单个列一次跨数据框剥离空间的优雅方式