我正在使用大型数据集,并且其中一列具有非常长的整数,如下所示:
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中的每个相等值都需要相同的随机数。
答案 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.factorize
和numpy.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