我有一列整数,有些是唯一的,有些是相同的。 我想在每行 0 到 1 之间添加一列随机浮点数,但我希望每个整数的所有浮点数都相同。
我提供的代码显示了一列整数和第二列随机浮点数,但我需要相同整数的浮点数,如 1、1 和 1,或 6 和 6,都相同,同时仍然具有分配给该整数的任何浮点随机生成。 但是,我正在使用的整数是 8 位数字,而我使用的数据集约为 500,000 行,因此我正在尝试尽可能高效。
我创建了一个工作解决方案,该解决方案循环访问已创建的数据框,但是创建随机列,然后像整数一样循环检查需要很长时间。 我不确定是否有更有效的方法。
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()
在groupby
后使用 transform
:
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 毫秒。
这不是完全无迭代的,但你仍然只迭代组而不是每一行,所以它更好一点:
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应该是您正在寻找的结果。
整数键创建一个具有随机浮点数的字典,然后将第 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)
有关如何将系列映射到字典的详细信息,请参阅此处:
在熊猫系列中使用 if/else 根据条件创建新系列
通过这种方式,您可以获得所需的结果,而无需重新排列数据帧或循环访问数据帧。
干杯!