如何将不同范围的数据随机插入到不同的行中

By simon at 2018-02-28 • 0人收藏 • 31人看过

我想创建一个包含不同范围的系列 随机值。比方说,我有一个包含的系列ns 12行。我会 喜欢随机选取4行,然后在4到10之间随机填写值 再次我必须选择另一个4行,并在-4到之间随机填写值 -10。同样,我必须挑选所有行的其余部分并随机填写值 between 15到100.如何在熊猫中实现这一点。 输入:

Col1
0  NaN
1  NaN
2  NaN
3  NaN
4  NaN
5  NaN
6  NaN
7  NaN
8  NaN
9  NaN
10 NaN
11 NaN 
输出:
Col1
0  20
1  34
2  -2
3  -7
4  5
5  69
6  -5
7  7
8  97
9  6
10 9
11 -9
到目前为止,我试图随机屏蔽索引和随机使用填充值,
df.loc[mask1,'col1']=np.random.randint(4,10, df.shape[0])
df.loc[mask2,'col1']=np.random.randint(-4,-10, df.shape[0])
df.loc[mask3,'col1']=np.random.randint(15,100, df.shape[0])
有没有其他更好的方法来实现这一目标?

3 个回复 | 最后更新于 2018-02-28
2018-02-28   #1

您可以连接所有值,然后再使用 [numpy.random.choice](https://docs.scipy.org/doc/numpy/reference/generated / numpy.random.choice.html):

a = np.r_[np.arange(4,10), np.arange(-4,-10, -1), np.arange(15, 100)]
要么:
a = np.concatenate([np.arange(4,10), np.arange(-4,-10, -1), np.arange(15, 100)])
print (a)
[ 4  5  6  7  8  9 -4 -5 -6 -7 -8 -9 15 16 17 18 19 20 21 22 23 24 25 26 27
 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99]


df['col1'] = np.random.choice(a, size=df.shape[0])
print (df)
    col1
0      5
1     65
2     41
3     31
4     86
5      5
6     99
7     42
8     37
9     38
10    -7
11     7
编辑:
size = int(df.shape[0]/3)
remain = df.shape[0] - 2 * size

a = np.random.randint(4,10, size=size)
b = np.random.randint(-10,-4, size=size)
c = np.random.randint(15,100, size=remain)

d = np.r_[a,b,c]
np.random.shuffle(d)
df['col1'] = d

print (df)
    col1
0      8
1     -7
2     66
3     60
4      8
5     -9
6     24
7     -9
8      7
9      8
10    86
11    -5
12     5
13    -8
14    40

2018-02-28   #2

您可以连接所有值,然后再使用 [numpy.random.choice](https://docs.scipy.org/doc/numpy/reference/generated / numpy.random.choice.html):

a = np.r_[np.arange(4,10), np.arange(-4,-10, -1), np.arange(15, 100)]
要么:
a = np.concatenate([np.arange(4,10), np.arange(-4,-10, -1), np.arange(15, 100)])
print (a)
[ 4  5  6  7  8  9 -4 -5 -6 -7 -8 -9 15 16 17 18 19 20 21 22 23 24 25 26 27
 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99]


df['col1'] = np.random.choice(a, size=df.shape[0])
print (df)
    col1
0      5
1     65
2     41
3     31
4     86
5      5
6     99
7     42
8     37
9     38
10    -7
11     7
编辑:
size = int(df.shape[0]/3)
remain = df.shape[0] - 2 * size

a = np.random.randint(4,10, size=size)
b = np.random.randint(-10,-4, size=size)
c = np.random.randint(15,100, size=remain)

d = np.r_[a,b,c]
np.random.shuffle(d)
df['col1'] = d

print (df)
    col1
0      8
1     -7
2     66
3     60
4      8
5     -9
6     24
7     -9
8      7
9      8
10    86
11    -5
12     5
13    -8
14    40

2018-02-28   #3

我认为最简单的就是创建索引列表并对其进行改组。

import random

indexes = list(range(len(data)))  # create list of indexes
random.shuffle(indexes)  # shuffle it

for i in range(len(data)):
    if i < 4:  # first 4 rows
        data[indexes[i]] = random.randint(4, 10)
    elif i < 8:  # another 4 rows
        data[indexes[i]] = random.randint(-4, -10)
    else:  # rest
        data[indexes[i]] = random.randint(15, 100)

编辑:

import random

indexes = list(range(len(data)))  # create list of indexes
random.shuffle(indexes)  # shuffle it

for i in range(len(data)):
    if i < (len(data)//3):  # first 1/3 rows
        data[indexes[i]] = random.randint(4, 10)
    elif i < (len(data)//3)*2:  # another 1/3 rows
        data[indexes[i]] = random.randint(-10, -4)
    else:  # rest
        data[indexes[i]] = random.randint(15, 100)
我测试过了。什么它确实是用随机填充1/3的元素 第一范围,第二范围的左数​​字的1/2和第三响的休息即 索引是随机的,因为它们是从“索引”列表中挑选出来的 洗牌。时间复杂度是O(n)(线性)在哪里n是数据的长度。

登录后方可回帖

Loading...