将某个类别的范围内的随机数分配给pandas数据帧

时间:2018-05-23 03:26:03

标签: python pandas numpy random

我的数据框看起来像这样:

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

我想将5到45之间的随机数分配给对应于鱼的条目,并将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 :(得分:2)

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

答案 1 :(得分:-1)

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