将随机值平均分配给pandas数据帧

问题描述 投票:0回答:2

我有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。

权重永远不会超过“区域”列中的值的数量,这意味着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())
python pandas dataframe random
2个回答
1
投票

假设你有字典存储每个区域的权重。

weight_dict = {'A':2, 'B':2, 'C':1}

我用了。

  1. groupy然后循环它从dataframe得到每个组。
  2. np.rangeweight_dict产生可能的重量。
  3. np.repeat生成随机值。
  4. np.random.choicereplace=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每个变量,看看循环中发生了什么。


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])
© www.soinside.com 2019 - 2024. All rights reserved.