Python 如何将不同范围的数据随机插入到不同的行中
我想创建一个系列,这样它就随机包含不同范围的值。 假设我有一个包含12行的序列。我想随机选取4行,并随机填充4到10之间的值。然后,我必须再次选择另外4行,并随机填充-4到-10之间的值。类似地,我必须选择所有行的其余部分,并随机填充15到100之间的值。如何在熊猫身上实现这一点 输入:Python 如何将不同范围的数据随机插入到不同的行中,python,pandas,Python,Pandas,我想创建一个系列,这样它就随机包含不同范围的值。 假设我有一个包含12行的序列。我想随机选取4行,并随机填充4到10之间的值。然后,我必须再次选择另外4行,并随机填充-4到-10之间的值。类似地,我必须选择所有行的其余部分,并随机填充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
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])
还有其他更好的方法吗?您可以将所有值连接在一起,然后使用: 或:
编辑:
我认为最简单的方法是制作索引列表并将其洗牌
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)
随机导入
索引=列表(范围(长度(数据))#创建索引列表
随机。洗牌(索引)#洗牌
对于范围内的i(len(数据)):
如果i<4:#前4行
数据[索引[i]]=random.randint(4,10)
elif i<8:#另外4行
数据[索引[i]]=random.randint(-4,-10)
其他:#休息
数据[索引[i]]=random.randint(15100)
编辑:
随机导入
索引=列表(范围(长度(数据))#创建索引列表
随机。洗牌(索引)#洗牌
对于范围内的i(len(数据)):
如果i<(len(data)//3):#前1/3行
数据[索引[i]]=random.randint(4,10)
elif i<(len(data)//3)*2:#另外1/3行
数据[索引[i]]=random.randint(-10,-4)
其他:#休息
数据[索引[i]]=random.randint(15100)
我已经测试过了。它所做的是用第一个范围填充随机1/3的元素,用第二个范围填充左1/2的数字,其余用第三个范围填充。索引是随机的,因为它们是从“索引”列表中选择的,并且是无序的。时间复杂度是O(n)(线性),其中n是数据长度。我想填充所有范围的值。我的意思是它应该包含所有范围的值。不同范围的分布应该是常数。例如,如果我有60行20行range1中的值,20行range2中的值和range3中的剩余值。这可能吗?@jezrael-工作正常:-)它不是随机选取索引。在性能方面,它也会影响我
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
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)