Pandas数据框抽样最快的方法是什么?

6

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

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

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])

在第二部分中,我使用了以下代码:

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

目前在我的MacBook上,当n = 50.000时,分析大约需要1分钟40秒。欢迎提供如何改善此过程速度的建议!

PM这三个数据框(df_A, df_B, df_C)只有一个分类特征不同。挑战在于我想从每个类别中获取特定数量的样本。

2个回答

4
使用numpy的ndarray应该更快,因为pandas本身就是建立在numpy之上的。采样可以使用:numpy.random.choice,如此处所示。这相当于pd.sample。然后你可以从numpy切换回pandas。

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)]

1
谢谢!我已经在尝试使用随机选择方法,但转换为numpy数组确实有很大的改进。从100秒缩短到了约10秒:) 现在我正在查看转换回Pandas并评估结果。 - Elyakim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接