【问题标题】:Fastest way to sample Pandas Dataframe?采样 Pandas Dataframe 的最快方法?
【发布时间】:2019-05-25 19:28:24
【问题描述】:

首先,我想从三个数据帧(每个 150 行)中抽取随机样本并连接结果。其次,我想尽可能多地重复这个过程。

对于第 1 部分,我使用以下函数:

def get_sample(n_A, n_B, n_C):
    A = df_A.sample(n = n_A, replace=False)
    B = df_B.sample(n = n_B, replace=False)
    C = df_C.sample(n = n_C, replace=False)
    return pd.concat([A, B, C])

对于第 2 部分,我使用以下行:

results = [get_sample(5,5,3) for i in range(n)] 

目前在我的 MacBook 上使用 n = 50.000 进行分析大约需要 1 分 40 秒。欢迎任何有关如何提高此过程速度的建议!

PM 三个数据帧(df_A、df_B、df_C)仅在一个分类特征上有所不同。挑战在于我想要从每个类别中获取特定数量的样本。

【问题讨论】:

    标签: python pandas performance random


    【解决方案1】:

    使用 numpy ndarrays 应该更快,因为 pandas 本身是基于 numpy 构建的。可以通过numpy.random.choice 进行采样,如here 所述。这应该相当于pd.sample。然后你可以从 numpy 切换回 pandas。

    【讨论】:

      【解决方案2】:

      在您的情况下,使用 numpy 数组而不是 pandas 数据帧应该是值得的(正如 Leevo 已经指出的那样)。

      Numpy 数组是比 pandas 数据帧更简单的对象(numpy 数组中没有行/列标签就是一个很好的例子)。因此,numpy 数组允许更快地执行连接等操作。当您在较大的脚本中仅执行几个连接时,时间差异通常可以忽略不计。但是,在您在多次迭代循环中进行连接的情况下,时间差异可能会累积并变得显着。

      尝试以下方法:

      import pandas as pd
      import numpy as np
      
      # Initialize example dataframes
      df_A = pd.DataFrame(np.random.rand(150, 10))
      df_B = pd.DataFrame(np.random.rand(150, 10))
      df_C = pd.DataFrame(np.random.rand(150, 10))
      
      # Initialize constants
      n_A = 5
      n_B = 5
      n_C = 3
      n = 10000
      
      # Reduce dataframes to numpy arrays
      arr_A = df_A.values
      arr_B = df_B.values
      arr_C = df_C.values
      
      # Perform sampling on numpy arrays
      def get_sample():
          A = arr_A[np.random.choice(arr_A.shape[0], n_A, replace=False)]
          B = arr_B[np.random.choice(arr_B.shape[0], n_B, replace=False)]
          C = arr_C[np.random.choice(arr_C.shape[0], n_C, replace=False)]
          return np.concatenate([A, B, C])
      results = [get_sample() for i in range(n)]
      

      【讨论】:

      • 谢谢!我已经在尝试随机选择方法,但是转换为 numpy 数组产生了很大的不同。从 100 秒缩短到大约 10 秒:) 现在我正在查看转换回 Pandas 并评估结果。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-11
      • 2016-01-14
      • 2019-04-10
      • 2012-08-24
      • 2017-11-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多