Ely*_*kim 6 python random performance pandas
首先,我想从三个数据帧(每个 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])
Run Code Online (Sandbox Code Playgroud)
对于第 2 部分,我使用以下行:
results = [get_sample(5,5,3) for i in range(n)]
Run Code Online (Sandbox Code Playgroud)
目前,n = 50.000在我的 MacBook 上分析大约需要 1 分 40 秒。欢迎就如何提高此过程的速度提供任何建议!
PM 三个数据帧(df_A、df_B、df_C)仅在一个分类特征上有所不同。挑战在于我想要每个类别的特定数量的样本。
在你的情况下,使用 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)]
Run Code Online (Sandbox Code Playgroud)