Pandas генерирует столбец случайных чисел на основе столбца ID

#python #pandas

#python #pandas

Вопрос:

Я хотел бы генерировать случайные числа от 1 до n на основе столбца ID в моем фрейме данных. Повторяющиеся значения в этом столбце ID должны иметь одинаковое случайное число. Случайное число должно быть присвоено более чем 1 идентификатору, но количество идентификаторов, принадлежащих каждому случайному числу, должно быть равным или максимально равным, насколько это возможно. Мне также хотелось бы начальное значение, чтобы я мог воспроизвести результаты.

Очень простой пример, допустим, у меня есть столбец ID со значениями A, B, C, D, E. Я хотел бы назначить случайное число от 1 до 2. Итак, в этом примере идентификаторам A, B, E будет присвоено случайное число 1, а идентификаторам C, D — 2.

 ID   Random
A    1
C    2
A    1
B    1
E    1
D    2
  

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

Обновление: Ранее я пытался получить уникальный список идентификаторов, а затем генерировать случайные числа для каждого, но я создал фрейм данных и попытался объединить 2 фрейма данных, что отнимало слишком много времени.

Комментарии:

1. Не могли бы вы обновить вопрос, чтобы показать, что вы пробовали / исследовали до сих пор? С места в карьер я бы сказал, что создайте dict с {id: num} парами и сопоставьте их со столбцом.

Ответ №1:

Благодаря S3DEV он предложил сопоставить словарь с столбцом, что было намного быстрее.

 ID_list = df['ID'].unique()
random_list = np.random.randint(1, 2, size=len(ID_list))
dic = {ID_list[i]: random_list[i] for i in range(len(ID_list))} 
df['Random'] = df['ID'].map(dic) 
  

Комментарии:

1. Не беспокойтесь, приятель, рад, что это помогло. (Не стесняйтесь голосовать за любой из моих других ответов). 😉

Ответ №2:

Чтобы исправить ваш подход (т. Е. Создать боковой фрейм данных):

 n = 10

ids = df[["ID"]].drop_duplicates()
ids["Random"] = np.random.randint(1, n, len(ids))
ids.set_index("ID", inplace=True)
df.set_index("ID", inplace=True)
df["Random"] = ids["Random"]
df.reset_index(inplace=True)
  

Выводит:

   ID  Random
0  A       6
1  C       7
2  A       6
3  B       4
4  E       1
5  D       6