【问题标题】:How to replace values using multiple conditions in Pandas series?如何在 Pandas 系列中使用多个条件替换值?
【发布时间】:2021-10-10 05:40:28
【问题描述】:

我有栏目:dataset["RSI_14D"]

我要分配:

1 如果意甲的行

-1 如果意甲的行数 >= 80

0 如果意甲的第 20 行

我试过了:

dataset.loc[dataset["RSI_14D"] >= 80, 'RSI_14D1'] = -1
dataset.loc[dataset["RSI_14D"] <= 20, 'RSI_14D1'] = 1
dataset.loc[dataset["RSI_14D1"] != 1 & -1, 'RSI_14D1'] = 0

但不起作用

当我写作时:

dataset["RSI_14D1"][dataset["RSI_14D1"]  == -1  ]

即使有 30 多行的值 >= 80,它也会给我 0 个值

当我写作时

dataset["RSI_14D1"][dataset["RSI_14D1"]  == 1  ]

没关系,它替换了值

【问题讨论】:

  • 你可能会打破你的逻辑,将所有 80+ 设置为 -1 在清除
  • 会发生什么?你怎么知道它不起作用?
  • 因为当我输入: dataset["RSI_14D1"][dataset["RSI_14D1"] == -1 ] 即使有 30+ 个值的值,它也会给我 0 个值和 "-1" >= 80

标签: python pandas dataframe replace series


【解决方案1】:

您的代码不起作用,因为对于最后一行代码,新列 RSI_14D1 的值仍未为 RSI_14D 的行定义,其值在 20 到 80 之间。

您可以将最后一行代码替换为:

dataset.loc[dataset["RSI_14D"].between(20, 80,  inclusive='neither'), 'RSI_14D1'] = 0

或

dataset.loc[(dataset["RSI_14D"] > 20) & (dataset["RSI_14D"] < 80), 'RSI_14D1'] = 0

替代解决方案

或者,如果您想在 RSI_14D 值介于 20 和 80 之间时以不同方式处理这种情况,可以通过为新列 RSI_14D1 设置默认值 0 来实现,如下所示:

# Add this line at the front:
dataset['RSI_14D1'] = 0

# Keep your first 2 lines of codes:
dataset.loc[dataset["RSI_14D"] >= 80, 'RSI_14D1'] = -1
dataset.loc[dataset["RSI_14D"] <= 20, 'RSI_14D1'] = 1

【讨论】:

  • @TreesJin 添加了替代解决方案。你可以看看。
  • @TreesJin 很高兴为您提供帮助!请记住,对于编程来说,为最常见的场景初始化一个值并为特殊情况添加特殊处理通常更容易。
猜你喜欢
  • 2021-08-17
  • 2021-07-19
  • 2019-12-07
  • 1970-01-01
  • 2020-08-11
  • 2020-07-24
  • 1970-01-01
  • 2018-08-30
  • 1970-01-01
相关资源
最近更新 更多