【问题标题】:Assign random values equally to pandas dataframe将随机值平均分配给熊猫数据框
【发布时间】:2019-04-09 07:25:47
【问题描述】:

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

当“区域”列中的值是奇数时,例如“B”,我想平均分配随机值,但余数可以具有任何随机整数值。

当“区域”列中的值是偶数时,例如“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())

【问题讨论】:

  • 您可以编辑您的帖子以包含您尝试过的代码吗?
  • 每个地区都有权重栏吗?
  • 目前,我没有,但我可以在每个区域的主数据框中添加权重列
  • 如果 A 的权重为 2,这意味着随机值只能是 [1, 2] 对吧?
  • 是的,没错。如果权重是 3 个随机值应该是 [1,2,3]

标签: python pandas dataframe random


【解决方案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每个变量看看循环中发生了什么。

【讨论】:

    【解决方案2】:

    除了尝试生成随机数之外,您还可以通过创建所需的随机值列表并尝试随机选择索引来做到这一点。

    例如:-

    >>> 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])
    

    【讨论】:

      猜你喜欢
      • 2017-09-21
      • 2018-02-01
      • 2018-05-15
      • 2021-03-10
      • 2019-06-19
      • 1970-01-01
      • 2016-03-03
      • 1970-01-01
      • 2020-04-26
      相关资源
      最近更新 更多