比较元素并将大于随机数的值返回true

时间:2018-02-01 15:49:28

标签: python arrays pandas for-loop random

我试图将一个数组px中的每个唯一变量与另一个数组py中的随机数进行比较。如果px中的元素大于或等于py的元素,则我想将该值注释为True

这里有一些代码。

import pandas as pd
import random

px = np.array([0.360617,0.360617,0.360617,0.989699,0.989699,0.989699,-1.020482])
py = np.random.uniform(low=0, high=1, size=len(px))

df = pd.DataFrame({'px': px, 'py': py, 'status': px >= py})

结果数据框如下所示:

         px        py  status
0  0.360617  0.509826   False
1  0.360617  0.129870    True
2  0.360617  0.818778   False
3  0.989699  0.953721    True
4  0.989699  0.740662    True
5 -1.020482  0.302593    False

但我需要它看起来像这样。想象一下,每个唯一px在0和1之间都有自己的关联随机值py

name  px        py         status
a     0.360617  0.509826   False
a     0.360617  0.509826   False
a     0.360617  0.509826   False
b     0.989699  0.953721   True
b     0.989699  0.953721   True
c     -1.020482 0.302593  False

我想这可以通过for循环完成,其中每个name与某个随机值相关联。

2 个答案:

答案 0 :(得分:3)

这是你需要的吗?

c,n=np.unique(px,return_counts=True)
py = np.random.uniform(low=0, high=1, size=len(n))
df = pd.DataFrame({'px':  np.repeat(c,n), 'py': np.repeat(py,n), 'status': np.repeat(c,n)>= np.repeat(py,n)})


df
Out[401]: 
         px        py  status
0 -1.020482  0.862371   False
1  0.360617  0.077589    True
2  0.360617  0.077589    True
3  0.360617  0.077589    True
4  0.989699  0.376675    True
5  0.989699  0.376675    True
6  0.989699  0.376675    True

答案 1 :(得分:0)

随机数是以伪随机的方式生成的(有关详细信息,请查看this),这里的问题是每次调用np.random.uniform(low=0, high=1, size=len(px))时都会创建一个全新的数字。 为了获得相同的伪随机数,只需使用random.seed(number)(对于所有py调用,该数字必须相同,但与其他变量不同)每次要获取相同的数字时之前然后调用我上面提到的函数。因此,您将获得py的相同值。

修改

由于下面的评论,我已经意识到(感谢@roganjosh)另一种解决方案的方法是使用map来存储一些随机确定的特定变量值:

首先,我创建了一张新地图:seeds = {"py": random.uniform(0,1)},每当您想再次获得py值时,您必须使用以下内容调用种子:seeds.get("py")(您在哪里可以为其他值更改py。我还创建了一个函数,因此您可以根据需要添加带有数值的键:

def raandomseed(key):

seeds.update({key:random.uniform(0,1)})

有关伪随机函数的更多信息,请查看Python wiki here