我有熊猫数据框,比如说df
Region ID
A 111
A 222
A 333
A 444
B 555
B 666
B 777
C 888
C 999
ID列具有权重。在这种情况下,A的权重为2,B的权重为2,C的权重为1。
权重永远不会超过“区域”(Region)列中值的数量,这意味着A的权重永远不会超过4,因为我们有4条关于A的记录
我想创建一个新列,并在此列中根据ID列中的权重分配随机整数值,但这些随机值必须平均分配。为了更加清晰,我希望新的数据框看起来像这样
Region ID Random_Value
A 111 1
A 222 2
A 333 1
A 444 2
B 555 2
B 666 2
B 777 1
C 888 1
C 999 1
当“区域”(Region)列中的值是奇数时,例如“ B”,我想平均分配随机值,但其余部分可以具有任何随机整数值。
当“区域”(Region)列中的值是偶数时,例如“ A”,其权重为2,我需要分配1到2之间的随机整数值(包括2和1),并且这些随机整数的数量应相等。 / strong>
我尝试了很多方法,但没有成功。有办法解决这个问题吗?
我的代码如下:
df['Random_Value'] = np.nan
A = df['region'] == 'A'
df.loc[A, 'Random_Value'] = np.random.randint(1,3, size=A.sum())
答案 0 :(得分:1)
假设您有字典来存储每个区域的权重。
weight_dict = {'A':2, 'B':2, 'C':1}
我用过。
groupy
然后在其上循环以从dataframe
中获取每个组。np.range
从weight_dict
生成可能的权重。np.repeat
生成随机值。np.random.choice
与replace=False
一起获得值而无需替换。然后使用np.concatenate
创建新列以合并列表。
ls = []
for idx, d in df.groupby('Region'):
group_size = d.shape[0]
weight_range = np.arange(1, weight_dict[idx]+1)
combination = np.repeat(weight_range, np.ceil(group_size/len(weight_range)))
ls.append(np.random.choice(combination, group_size, replace=False))
df['Random_Value'] = np.concatenate(ls)
df
Region ID Random_Value
0 A 111 2
1 A 222 1
2 A 333 1
3 A 444 2
4 B 555 1
5 B 666 2
6 B 777 2
7 C 888 1
8 C 999 1
您可以尝试print
每个变量来查看循环中发生了什么。
答案 1 :(得分:0)
除了尝试生成随机数之外,您还可以通过创建所需的随机值列表并尝试随机选择索引来完成此操作。
例如:-
>>> a=[1,1,2,2]
>>> numpy.random.choice(4, 4, replace=False)
array([0, 3, 2, 1])
根据生成的随机索引,您可以分配值。
对于奇数,可以生成如下的随机列表。
>>> np.random.randint(1,3,size=3)
array([1, 1, 2])