Python:根据两个熊猫系列之间的某种条件创建新的二进制列表

时间:2019-02-24 14:56:32

标签: python pandas numpy scikit-learn scipy

我正在尝试比较两个列表,一个是一系列已知值,另一个是来自分类器的一系列预测,并创建一个关于两个元素是否“足够接近”的新二进制列表。

我将使用RMSE来衡量适合度,如果预测值和已知值之间的差小于1,我想在新列表的此位置放置1,并且如果误差为大于1,此时在新列表中返回0。

例如:

y_known = {23,45,67,83}
y_pred = {23,46,64,78}

应该返回

binary_array = [1,1,0,0]

我需要它来计算我训练有素的系统的精度/召回率曲线。我已经看过使用lambda表达式,但是显然对于这种类型的问题,它比值得的麻烦。任何建议将不胜感激。

更新

这完美无瑕,并且完全满足了我的需要。原始作者撤回了他的评论,但非常感谢!

def createBinaryArray(x, y, k):
    assert(len(x) == len(y))
    return([1 if abs(a-b)<=k else 0 for a,b in zip(x, y)])

1 个答案:

答案 0 :(得分:0)

您可以使用

(np.abs(y_known - y_pred) <= 1).astype(int)

在您的示例输入中:

In [265]: y_known = np.array([23, 45, 67, 83])

In [266]: y_pred = np.array([23, 46, 64, 78])

In [267]: (np.abs(y_known - y_pred) <= 1).astype(int)
Out[267]: array([1, 1, 0, 0])

编辑,基于以下注释:如果您开始使用的是熊猫系列,则相同的方法将发挥相同的作用:

In [273]: y_known = pd.Series([23, 45, 67, 83])

In [274]: y_pred = pd.Series([23, 46, 64, 78])

In [278]: ((y_known - y_pred).abs() <= 1).astype(int)
Out[278]:
0    1
1    1
2    0
3    0
dtype: int32