我有一个数据框(df)和一个包含组号的变量。每个观察都有一个从1到80的组号。我想创建一个新变量new_group,其中包含每个观察从1到80的新随机数。但是,这些新组号必须与原始组号保持一致,因为如果在组1中有2个观测值,则两个观测值应具有相同的新随机组号。
示例:
observation group random_group
0 1 4
1 2 3
2 1 4
3 43 1
4 1 4
5 21 80
6 43 1
我正在使用Python 3.7。我尝试了以下方法: 1.我创建了一个字典,键从1到80,值从1到80,但顺序不同。想法是使用此字典进行Excel“ vlookup”类型的匹配。
- 我创建了一个包含两列的新数据框:一个列的值从1到80,另一列的数字从1到80,但顺序不同。想法是将原始数据框与新数据框合并。
这是我所做的:
import random
ordered_group = list(range(1,81))
random_group = random.sample(range(1,81),80)
group_dict = dict(zip(ordered_group,random_group))
df['new_group'] = df.group.map(group_dict)
new_group列仅包含nan
我也尝试了此方法,而不是最后一行:
df['new_group'] = df["group"].apply(lambda x: group_dict .get(x))
现在,它可以一次正确地映射所有80个组,但不能涵盖所有观察结果
我也尝试使用merge
而不是map
import random
random_group= list(range(1,81))
random_group= pd.DataFrame(random_group)
random_group['new_group'] = random.sample(range(1,80)
random_group.rename(columns={0:'group'},inplace=True )
df= df.merge(random_group,on = 'group',how = 'outer')
它一次正确地映射了所有80个组,但没有遍历所有观察结果
所以我得到这样的东西:
observation group random_group
0 1 4
1 2 3
2 1 nan
3 43 1
4 1 nan
5 21 80
6 43 nan
我的两种方法似乎运行良好,但是它们无法遍历整个数据帧。知道我哪里出错了吗?另外,欢迎使用任何更有效的方法
谢谢!