采样熊猫数据框的最快方法?

时间:2018-12-27 20:37:49

标签: python pandas performance random

首先,我想从三个数据帧(每个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)] 

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

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

2 个答案:

答案 0 :(得分:1)

使用numpy ndarrays应该更快,因为pandas本身是基于numpy构建的。可以使用numpy.random.choice完成采样,如here所述。那应该等效于pd.sample。然后,您可以从numpy切换回熊猫。

答案 1 :(得分:1)

在您的情况下,使用numpy数组而不是熊猫数据框(如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)]