#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