将一列随机浮点数添加到数据帧,但对于相等的数据帧条目具有相同的值

时间:2019-07-19 17:59:00

标签: python pandas numpy dataframe random

我有一列整数,有些是唯一的,有些是相同的。我想为每行添加一列介于0和1之间的随机浮点数,但我希望所有整数的浮点数都相同。

我提供的代码显示一列int和第二列随机浮点数,但是我需要相同int的浮点数(例如1、1,和1或6和6)都相同,同时仍然随机生成分配给该int的任何浮点数。但是,我正在使用的int是8位数字,并且我使用的数据集大约有500,000行,因此我试图尽可能地提高效率。

我已经创建了一个可行的解决方案,该解决方案遍历已创建的数据框,但是创建随机列,然后像int这样进行遍历检查需要很长时间。我不确定是否有更有效的方法。

import numpy as np
import pandas as pd

col1 = [1,1,1,2,3,3,3,4,5,6,6,7]
col2 = np.random.uniform(0,1,12)

data = np.array([col1, col2])

df1 = pd.DataFrame(data=data)
df1 = df1.transpose()

3 个答案:

答案 0 :(得分:1)

transform之后使用groupby

col1 = [1,1,1,2,3,3,3,4,5,6,6,7]
df = pd.DataFrame(col1, columns=['Col1'])

df['Col2'] = df.groupby('Col1')['Col1'].transform(lambda x: np.random.rand())

结果:

    Col1      Col2
0      1  0.304472
1      1  0.304472
2      1  0.304472
3      2  0.883114
4      3  0.381417
5      3  0.381417
6      3  0.381417
7      4  0.668433
8      5  0.365895
9      6  0.484803
10     6  0.484803
11     7  0.403913

在我的旧笔记本电脑上,600K行大约需要200毫秒。

答案 1 :(得分:0)

为每个整数键创建一个随机浮点数的字典,然后将第2列映射到字典。

对于已存在于Column1中的整数,请首先制作字典:

myInts = df.Column1.unique().tolist()
myFloats = [random.uniform(0,1) for i in range(len(myInts))]

myDictionary = dict(list(zip(myInts , myFloats )))

这将为您提供:

{0: 0.7361124230574458,
 1: 0.8039650720388128,
 2: 0.7474880952026456,
 3: 0.06792890878546265,
 4: 0.4765215518349696,
 5: 0.8058550699163101,
 6: 0.8865969467094966,
 7: 0.251791893958454,
 8: 0.42261798056239686,
 9: 0.03972320851777933,
....
}

然后将字典键映射到第1列,以便每个相同的整数都具有相同的浮点数。像这样:

df.Column2 = df.Column1.map(myDictionary)

有关如何将系列映射到字典的更多信息,请参见:

Using if/else in pandas series to create new series based on conditions

通过这种方式,您无需重新安排数据框或对其进行遍历即可获得所需的结果。

干杯!

答案 2 :(得分:0)

这不是完全没有迭代的,但是您仍然只在组上而不是在每一行上进行迭代,因此感觉更好:

col1 = [1,1,1,2,3,3,3,4,5,6,6,7] 
col2 = np.random.uniform(0,1,len(set(col1)))

data = np.array([col1])

df1 = pd.DataFrame(data=data) 
df1 = df1.transpose()

df2 = df1.groupby(0)

counter = 0
final_df = pd.DataFrame(columns=[0,1])
for key, item in df2:
    temp_df = df2.get_group(key)
    temp_df[1] = [col2[counter]]*df2.get_group(key).shape[0]
    counter += 1
    final_df = final_df.append(temp_df)

final_df应该是您要寻找的结果。