我试图将一个数组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
与某个随机值相关联。
答案 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