Присвоение случайных значений пандам одинаково - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть pandas dataframe, скажем, 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())

Ответы [ 2 ]

1 голос
/ 09 апреля 2019

Предположим, у вас есть словарь для хранения веса каждой области.

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

Я использовал.

  1. groupy, затем зациклите его, чтобы получить каждую группу из dataframe.
  2. np.range для генерации возможного веса из weight_dict.
  3. np.repeat для генерации случайных значений.
  4. 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 028 *

0 голосов
/ 09 апреля 2019

Кроме попыток сгенерировать случайное число, вы можете сделать это, создав необходимый список случайных значений и попытавшись случайным образом выбрать индекс.

например: -

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