назначить случайное число в пределах диапазона для определенной категории для кадра данных pandas - PullRequest
0 голосов
/ 23 мая 2018

У меня есть фрейм данных, который выглядит примерно так:

0     Fish     Trout      
1     Fish  Pickerel      
2     Fish      Pike      
3     Bird     Goose      
4     Bird      Duck   

Я бы хотел назначить случайное число от 5 до 45 для записей, соответствующих fish, и случайное число от 55 до 95на записи, соответствующие птицам (логика здесь заключается в том, чтобы сгенерировать числовое значение, чтобы я мог построить его в соответствии с некоторыми другими числовыми критериями в боке или морском пороге).

Я дошел до этого:

Установите переменные для представления диапазонов генерации случайных чисел

Num_Fish = np.random.randint(5, 45)
Num_Bird = np.random.randint(55, 95)

Используйте указанные выше переменные в словаре и отобразите их вновый столбец, сопоставленный со столбцом категории

d = {'Bird': Num_Bird, 'Fish': Num_Fish}
data['Random'] = data['Category'].map(d)

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

Так что в данный момент он производит что-то вроде этого:

0     Fish     Trout      22
1     Fish  Pickerel      22
2     Fish      Pike      22
3     Bird     Goose      53
4     Bird      Duck      53

Как я могу получитьуникальные случайные числа (в указанном диапазоне) для отдельных записей в каждой категории?

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

Было бы оченьблагодарен за любые предложения ... спасибо

Ответы [ 2 ]

0 голосов
/ 23 мая 2018
from io import StringIO
import numpy as np
import pandas as pd


df = pd.read_csv(StringIO('''ID,ClassLevel0,ClassLevel1
0,Fish,Trout      
1,Fish,Pickerel      
2,Fish,Pike      
3,Bird,Goose      
4,Bird,Duck
'''))
df.index = df.ID

random_param = {'Fish': (5, 45), 'Bird': (55, 95)}


for level0, ldf in df.groupby('ClassLevel0'):
    df.loc[ldf.index, 'Value'] = np.random.randint(*random_param[level0], len(ldf))
0 голосов
/ 23 мая 2018

map и dict

dct = {'Bird': [55, 95], 'Fish': [5, 45]}

def map_animal(animal):
    return np.random.randint(*dct[animal])

df['rand_num'] = df.Type.map(map_animal)

   Type      Name  rand_num
0  Fish     Trout        25
1  Fish  Pickerel        18
2  Fish      Pike        44
3  Bird     Goose        56
4  Bird      Duck        74
...