【问题标题】:Pandas: Random integer between values in two columnsPandas:两列值之间的随机整数
【发布时间】:2018-09-18 04:02:44
【问题描述】:

如何创建一个新列来计算特定行中两列值之间的随机整数。

例子df:

import pandas as pd
import numpy as np

data = pd.DataFrame({'start': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
                     'end': [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]})
data = data.iloc[:, [1, 0]]

结果:

现在我正在尝试这样的事情:

data['rand_between'] = data.apply(lambda x: np.random.randint(data.start, data.end))

data['rand_between'] = np.random.randint(data.start, data.end)

但它当然不起作用,因为 data.start 是一个系列而不是一个数字。 如何将 numpy.random 与列中的数据一起用作矢量化操作?

【问题讨论】:

  • 只是为了确定,当你说你想要一个“两列值之间的随机整数”时,你想在可能的随机值中包括端点吗?默认情况下,nump.random.randint(low, high) 在可能的输出中不包括值high,因此如果需要,请务必使用randint(low, high+1)
  • @WarrenWeckesser 你是对的。我想在计算中包括终点。我会根据您的评论调整 jezrael anwer。

标签: python-3.x pandas numpy random


【解决方案1】:

您很接近,需要指定 axis=1 用于按行处理数据,并将 data.start/end 更改为 x.start/end 以使用标量:

data['rand_between'] = data.apply(lambda x: np.random.randint(x.start, x.end), axis=1)

另一种可能的解决方案:

data['rand_between'] = [np.random.randint(s, e) for s,e in zip(data['start'], data['end'])]

print (data)
   start  end  rand_between
0      1   10             8
1      2   20             3
2      3   30            23
3      4   40            35
4      5   50            30
5      6   60            28
6      7   70            60
7      8   80            14
8      9   90            85
9     10  100            83

【讨论】:

    【解决方案2】:

    如果您想真正对其进行矢量化,您可以生成一个介于 0 和 1 之间的随机数,并使用您的最小/最大数字对其进行标准化:

    (
        data['start'] + np.random.rand(len(data)) * (data['end'] - data['start'] + 1)
    ).astype('int')
    
    Out: 
    0     1
    1    18
    2    18
    3    35
    4    22
    5    27
    6    35
    7    23
    8    33
    9    81
    dtype: int64
    

    【讨论】:

      猜你喜欢
      • 2012-07-10
      • 1970-01-01
      • 2015-01-22
      • 2012-04-25
      • 2015-11-07
      • 1970-01-01
      • 2015-02-12
      • 2013-10-14
      • 2017-06-17
      相关资源
      最近更新 更多