使用for循环和if语句有条件地覆盖系列值

时间:2019-05-05 20:01:55

标签: python pandas for-loop if-statement

我使用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覆盖。

我尝试将forif循环组合在一起:

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

当我转向多类模型时,这将带来不便。如何使用forif表示法获得相同的结果?

PS:不好意思。我最近从R转到了Python,一切真的很混乱。

2 个答案:

答案 0 :(得分:1)

如果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]

答案 1 :(得分:1)

here说明了您尝试执行的操作无效的原因。基本上,您无法修改要循环的元素。

要遵循forif语句,您可以采取以下措施:

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

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