【问题标题】:Adding column of random floats to data frame, but with equal values for equal data frame entries将随机浮点列添加到数据框中,但相同数据框条目的值相同
【发布时间】:2019-11-28 17:59:29
【问题描述】:

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

我提供的代码显示了一列整数和第二列随机浮点数,但我需要相同整数的浮点数,例如 1、1 和 1,或 6 和 6,都相同,同时仍然随机生成分配给该 int 的任何浮点数。然而,我正在使用的整数是 8 位数字,而我正在使用的数据集大约有 500,000 行,所以我尽量提高效率。

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

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()

【问题讨论】:

  • 转置很慢。

标签: python pandas numpy dataframe random


【解决方案1】:

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 毫秒。

【讨论】:

    【解决方案2】:

    为每个整数键创建一个带有随机浮点数的字典,然后将第 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

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

    干杯!

    【讨论】:

      【解决方案3】:

      这不是完全没有迭代的,但你仍然只是迭代组而不是每一行,所以它稍微好一点:

      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 应该是您要查找的结果。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-09
        • 2015-10-18
        相关资源
        最近更新 更多