首先,我想从三个数据帧(每个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)仅在一种分类特征上有所不同。面临的挑战是,我想从每个类别中获取特定数量的样本。
答案 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)]