【问题标题】:Conditionally overwrite values in series using a for loop and if statement使用 for 循环和 if 语句有条件地覆盖系列值
【发布时间】:2019-05-05 20:01:54
【问题描述】:

我使用stats.models 运行了一个 Logit 模型,并声明了一个带有预测值的序列:

M1 = sm.Logit(y_train, X_train)
M1_results = M1.fit()
y_pred = M1_results.predict(X_train)  # This returns a series

y_pred 是一个值介于 0 和 1 之间的序列。我想通过将它们与任意截止值进行比较来有条件地覆盖它的值。

基本上,如果M1_pred <= 0.7 的第i- 个元素,用0 覆盖。否则,用1覆盖。

我尝试将 for 和 if 循环组合在一起:

for i in y_pred:
    if i <= 0.7:
        i = 0
    else:
        i = 1

为什么这没有覆盖y_pred 中的任何值?

我不得不求助于切片(建议here):

y_pred[y_pred <= 0.7] = 0
y_pred[y_pred >  0.7] = 1

当我转向多类模型时,这会很不方便。如何使用for 和if 表示法获得相同的结果?

PS:请原谅我的无知。我最近从 R 迁移到 Python,一切都很混乱。

【问题讨论】:

  • for i, item in enumerate(y_pred): 然后y_pred[i] = 0
  • @OlvinR​​oght 我不懂语法。可以扩展一下吗?

标签: python pandas for-loop if-statement


【解决方案1】:

here 解释了您尝试执行的操作不起作用的原因。基本上你不能修改你正在循环的元素。

坚持for 和if 语句的方法如下:

for i in range(len(y_pred)):
    if y_pred[i] <= 0.7:
        y_pred[i] = 0
    else:
        y_pred[i] = 1

但是我不明白为什么即使在多类情况下你也不能坚持切片。但我想这是另一个问题。

【讨论】:

    【解决方案2】:

    如果y_pred 是列表的一个实例,您可以使用enumerate 函数来遍历带有索引的列表。这将使您可以通过列表中的索引设置项目的值。

    代码:

    for i, item in enumerate(y_pred):
        if item <= 0.7:
            y_pred[i] = 0
        else:
            y_pred[i] = 1
    

    或者你可以使用这个单行:

    y_pred = [0 if item <= 0.7 else 1 for item in y_pred]
    

    甚至更简单:

    y_pred = [int(item > 0.7) for item in y_pred]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-26
      • 2013-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-22
      相关资源
      最近更新 更多