【问题标题】:Compare elements and return values larger than random number as true比较元素并将大于随机数的值返回为真
【发布时间】:2018-07-12 00:16:38
【问题描述】:

我正在尝试将一个数组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 都有自己关联的随机值py,介于 0 和 1 之间。

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 都与某个随机值相关联。

【问题讨论】:

  • 你应该在你的例子中设置一个种子编号,这样我们就可以为“py”系列使用相同的值。
  • 关联的py是如何确定的?
  • @Dylan 我已经更新了问题

标签: python arrays pandas for-loop random


【解决方案1】:

这是你需要的吗?

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

【讨论】:

  • 我在现有的 DF 上使用 groupby 方法将头撞在砖墙上。沿着df['py'] = df.groupby([df.index, 'px'])['py'].first().reset_index() 的路线。它不起作用,但我希望使用 group by 中的索引可以让我将结果扩展回原始 df 中 py 的所有行。有点像 ffill 基于px 的值。我敢肯定,我已经看到这种类型的事情只是简单地完成但无法搜索。知道我的方法需要什么吗?
  • 嗨@Wen,它起作用了,但我确实收到了警告`RuntimeWarning:如果 name == 'main',则在更大的_equal 中遇到无效值:` .我也很好奇你是否对@roganjosh 有答案
  • @roganjosh 这就是你想要的吗? df.groupby(['px']).head(1).reindex(df.index).ffill()
  • @JAG2024 检查之前的评论 :-)
  • 应该是'__main__',但这与您的问题无关
【解决方案2】:

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

编辑

由于下面的 cmets,我意识到(感谢 @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

【讨论】:

  • 一个完全不同的替代解释是 OP 希望为每个唯一的 py 值获取第一个 px 值,并将其应用于 px 具有相同值的所有后续行。
  • @roganjosh 这样,您可以获得第一个 py 值创建一个随机种子(并将其存储以供将来调用 pyvalues),并使用该 py 值来获取使用random.seed(py) 的下一个px 变量。
  • 我感觉 OP 对随机性不太感兴趣,更多的是他们可能已经存在一个 DF,它在两列中具有各种不同的值,并且正在使用 random只是为了生成一个 DF 外观的 MCVE。这个问题中的代码实际上主要是我在回答this 问题时的代码。 px 可能只是为了方便示例而修复,以确保重复值。如果 OP 可以澄清几个人有问题,这将有所帮助。
  • @roganjosh 我更新了问题。现在清楚了吗?
  • @JAG2024 不适合我。我们正在进行的辩论是:您的问题是关于 (1)px 的每个值生成一致的、对应的py 值吗?即问题在于甚至在创建DF之前的py = np.random.uniform(low=0, high=1, size=len(px))代码或(2)您的DF已经创建并且值已经存在,它与random无关,而是您只是试图修复它,以便 px 始终与第一个对应的 py 值配对?
猜你喜欢
  • 2021-11-04
  • 2020-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-11
  • 1970-01-01
相关资源
最近更新 更多