将DataFrame列中的值随机化

我有一个数据框(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. 我创建了一个包含两列的新数据框:一个列的值从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

我的两种方法似乎运行良好,但是它们无法遍历整个数据帧。知道我哪里出错了吗?另外,欢迎使用任何更有效的方法

谢谢!

liran911 回答:将DataFrame列中的值随机化

将随机映射存储在dict中,然后存储在map中。在这种情况下,随机组的范围是1-4,因为您只有4个唯一组。在实际数据中,如果您有80个群组,则该数值将为1-80。

import numpy as np

grps = df.group.unique()
N = df.group.nunique()

d = dict(zip(np.random.choice(grps,N,replace=False),range(1,N+1)))
#{1: 3,2: 2,21: 4,43: 1}

df['random_group'] = df['group'].map(d)
#   observation  group  random_group
#0            0      1             3
#1            1      2             2
#2            2      1             3
#3            3     43             1
#4            4      1             3
#5            5     21             4
#6            6     43             1
,

我所做的是每次都生成随机组,并检查原始组是否已分配到新组中。 这似乎对我有用:

import pandas as pd
import random
data=pd.read_csv('file.csv')
processed_group=[]
for obs in data['observation']:
   x = int(random.randrange(1,80))
   if data.loc[obs,'group'] not in processed_group:
       data.loc[obs,'new_group']=x
       processed_group.append(data.loc[obs,'group'])
   elif data.loc[obs,'group'] in processed_group:
       index = data.index[data['group']== data.loc[obs,'group']].tolist()
       data.loc[obs,'new_group'] = data.loc[index[0],'new_group']
本文链接:https://www.f2er.com/3165905.html

大家都在问