我有 pandas 数据框,说 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(含)的随机整数值,并且这些随机整数的数量应该相等。
我尝试了很多方法,但没有成功。有办法解决这个问题吗?
我的代码如下:
df['Random_Value'] = np.nan
A = df['region'] == 'A'
df.loc[A, 'Random_Value'] = np.random.randint(1,3, size=A.sum())
最佳答案
假设您让字典存储每个区域的权重。
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
您可以尝试打印
每个变量以查看循环中发生了什么。
关于python - 为 pandas 数据框均匀分配随机值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55587228/