Самый быстрый способ сэмплирования данных Pandas? - PullRequest
0 голосов
/ 27 декабря 2018

Во-первых, я хочу взять случайные выборки из трех кадров данных (по 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 анализ занимает около 1 минуты и 40 секунд на моем MacBook.Любые советы о том, как повысить скорость этого процесса, приветствуются!

PM Три кадра данных (df_A, df_B, df_C) отличаются только одной категориальной функцией.Сложность в том, что мне нужно конкретное количество образцов из каждой категории.

Ответы [ 2 ]

0 голосов
/ 30 декабря 2018

В вашем случае стоит окупить работу с массивами numpy вместо фреймов данных pandas (как уже отмечалось в Leevo).

Массивы numpy являются более простыми объектами, чем фреймы данных pandas (отсутствие меток строк / столбцов вЧисловые массивы является ярким примером).В результате массивы 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)]
0 голосов
/ 30 декабря 2018

Работа с numpy ndarrays должна быть быстрее, так как сама pandas построена на numpy.Выборка может быть сделана с: numpy.random.choice, как объяснено здесь .Это должно работать как эквивалент pd.sample.Затем вы можете переключиться обратно с numpy на панд.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...