采样 Pandas Dataframe 的最快方法?

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)仅在一个分类特征上有所不同。挑战在于我想要每个类别的特定数量的样本。

Xuk*_*rao 3

在你的情况下,使用 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)