Какой самый быстрый способ заполнить пандас-фрейм данных из двух циклов for? - PullRequest
0 голосов
/ 12 мая 2018

У меня уже есть фрейм данных, и мне нужно выполнять вычисления для каждого индекса относительно всех предыдущих индексов (таким образом, для 187 показателей имеется 17766 вычислений). Это должно быть эффективным, чтобы масштабировать до миллионов вычислений.

#this is the original dataframe
df = pd.DataFrame(np.random.rand(187,2))
#this is the dataframe to write to
df2 = pd.DataFrame()
#blank list to write to
ind_diff = [] 

Метод 1: Список

for n in range(0, len(df)):     

    for i in range(n + 1, len(df)):

        ind_diff.append(df.index[i] - df.index[n])

Метод 2: добавление кадра данных

for n in range(0, len(df)):     

    for i in range(n + 1, len(df)):

        df2 = df2.append(df.Index[i] - df.Index[n])

Метод # 1 возвращает только окончательный расчет как вывод, то есть список длины 1. Почему это так? Метод № 2 работает, но он слишком медленный. Я знаю, что это не рекомендуемый способ создания фрейма данных (согласно документации и что pd.concat более эффективен), но я ищу самый быстрый подход. Заранее спасибо

1 Ответ

0 голосов
/ 12 мая 2018

Давайте попробуем арифметику широковещательного массива:

v = df.values
v = v - v[:, None]
i, j = np.triu_indices(df.shape[0])

df2 = pd.DataFrame(v[i, j])

Это очень быстро, но может быстро выйти из-под контроля из-за слишком большого количества записей (~ миллионов), потому что это приводит к выбросу памяти, а половина вычислений является избыточной (из-за симметрии).

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