大熊猫:将给定范围内的随机数分配给相等的列值

时间:2018-08-07 20:41:48

标签: python pandas dataframe random

我正在使用大型数据集,并且其中一列具有非常长的整数,如下所示:

       Column_1        Column_2
  1     A              12345123451
  2     B              12345123451
  3     C              12345123451
  4     D              23456789234
  5     E              23456789234
  6     F              34567893456

这里重要的不是Column_2中的实际数字,而是当这些数字相同而Column_1不同时。我想从较小的数字范围(例如(1,999))中随机分配Column_2的值。

       Column_1        Column_2
  1     A              120
  2     B              120
  3     C              120
  4     D              54
  5     E              54
  6     F              567

我的问题是想办法在lambda函数中描述Column_2中的每个相等值都需要相同的随机数。

2 个答案:

答案 0 :(得分:3)

您可以使用np.random.choice创建一个介于1到999之间的随机数数组,并确保说出replace=False,以免重复,然后将Column_2映射到Column_2个唯一值与您的随机数数组的字典映射:

import numpy as np 

nums = np.random.choice(range(1,999), size = df['Column_2'].nunique(), replace=False)

# If you prefer to use the random package rather than numpy, uncomment the following:
# import random
# nums = random.sample(range(1,999), df['Column_2'].nunique())

df['Column_2'] = df['Column_2'].map(dict(zip(df['Column_2'].unique(), nums)))

>>> df
  Column_1  Column_2
1        A       274
2        B       274
3        C       274
4        D       842
5        E       842
6        F       860

说明:

您的数字数组如下:

>>> nums
array([274, 842, 860])

您的映射字典如下:

>>> dict(zip(df['Column_2'].unique(), nums))
{12345123451: 274, 23456789234: 842, 34567893456: 860}

因此,在映射时,您是说用12345123451替换274,用23456789234替换842,依此类推...

答案 1 :(得分:3)

replace=False(更新后的答案)上从sacul那里获取线索

使用pandas.factorizenumpy.random

i, r = pd.factorize(df.Column_2)
choices = np.arange(max(999, r.size))
c = np.random.choice(choices, r.shape, False)

df.assign(Column_2=c[i])

  Column_1  Column_2
1        A       812
2        B       812
3        C       812
4        D       751
5        E       751
6        F       574