Pandas: ускорить df.loc на основе значений повторного индекса

У меня есть панды DataFrame

import pandas as pd import numpy as np df = pd.DataFrame({ 'x': ['a', 'b', 'c'], 'y': [1, 2, 2], 'z': ['f', 's', 's'] }).set_index('x') 

из которого я хотел бы выбрать строки на основе значений индекса ( x ) в массиве выбора

 selection = ['a', 'c', 'b', 'b', 'c', 'a'] 

Правильный вывод можно получить, используя df.loc следующим образом

 out = df.loc[selection] 

Проблема, с которой я df.loc – это df.loc работает довольно медленно на больших DataFrames (2-7 миллионов строк). Есть ли способ ускорить эту операцию? Я просмотрел eval() , но, похоже, это не относится к жестко закодированным спискам значений индекса, подобных этому. Я также думал об использовании pd.DataFrame.isin , но это пропускает значения повторения (только возвращает строку для каждого уникального элемента при selection ).

2 Solutions collect form web for “Pandas: ускорить df.loc на основе значений повторного индекса”

Вы можете получить приличное ускорение, используя reindex вместо loc :

 df.reindex(selection) 

Сроки (версия 0.17.0):

 >>> selection2 = selection * 100 # a larger list of labels >>> %timeit df.loc[selection2] 100 loops, best of 3: 2.54 ms per loop >>> %timeit df.reindex(selection2) 1000 loops, best of 3: 833 µs per loop 

Эти два метода принимают разные пути (следовательно, разность скоростей).

loc создает новый DataFrame, обращаясь к get_indexer_non_unique который обязательно более сложный, чем простой get_indexer (используется для уникальных значений).

С другой стороны, тяжелая работа в reindex , по-видимому, выполняется с помощью функций take_* в generate.pyx . Эти функции выглядят быстрее с целью создания нового DataFrame.

Вы можете попробовать merge :

 df = pd.DataFrame({ 'x': ['a', 'b', 'c'], 'y': [1, 2, 2], 'z': ['f', 's', 's'] }) df1 = pd.DataFrame({'x':selection}) In [21]: pd.merge(df1,df,on='x', how='left') Out[21]: xyz 0 a 1 f 1 c 2 s 2 b 2 s 3 b 2 s 4 c 2 s 5 a 1 f 
  • Скорость копирования буфера Python - почему массив медленнее, чем строка?
  • Что блокирует Ruby, Python, чтобы получить скорость Javascript V8?
  • Python: как сделать эту функцию цветокоррекции более эффективной
  • Установка значений в подмножестве Pandas DataFrame (копия) медленная
  • Эффективность искры для Scala vs Python
  • Медленная производительность с мешком Python Dask?
  • Является ли Python медленнее, чем Java / C #?
  • numba - guvectorize только быстрее, чем jit
  •  
    Interesting Posts for Van-Lav

    Jython, используйте только метод из Python с Java?

    Как получить доступ (и редактировать) переменные из функции обратного вызова?

    Атрибут столбца после groupBy в pyspark

    Как обнаружить конец файла в Python после итерации объекта файла с помощью инструкции «для»

    Обработка пар значений из двух последовательностей в Clojure

    В Python, как мне удалить элемент списка Nth из списка списков (удаление столбцов)?

    анализ утечки памяти xml с помощью xml.dom.minidom

    Что означает «выбор должен быть последовательным для всех потребителей»?

    Как добавить настраиваемый носовой плагин к команде `nosetests`

    Как эффективно найти линию горизонта на высотной фотографии?

    какие инструменты (ы) сборки вы рекомендуете для python?

    Равенство классов Python с использованием слотов

    Использовать пользовательский домен для флеш-приложения с аутентифицированным логином Google

    Кодирование переменных с помощью Pandas TimeSeries

    Как реализовать безопасный сервер WebSocket (wss: //) в Python?

    Python - лучший язык программирования в мире.