Как уже отмечалось, есть несколько подходов к этому.Необходимо учитывать два момента: что имеет смысл с точки зрения читабельности / Pythonic / Idiomatic и что имеет смысл с точки зрения производительности.Мои возможные решения не соответствуют полной спецификации OP, чтобы избежать функций, но я предложу их для рассмотрения и сравнения.
Давайте рассмотрим три подхода и рассмотрим их с обеих точек зрения.
ВВ этом случае, чтобы помочь нам более четко увидеть некоторые аспекты производительности путем синхронизации выполнения кода, мы увеличили размер DataFrame, повторив сохраненные значения в 100 000 раз.
import pandas as pd
df = pd.DataFrame({'col1':[32, 33, 34] * 100000,
'col2':[1, 2, 3] * 100000,
'col3':[1, 2, 3] * 100000,
})
ПОДХОД 1
В этом подходе используется процесс, описанный @ U9-Forward, то есть индексирование по столбцам, транспонирование строк и столбцов, чтобы вы могли затем индексировать нужные строки и транспонировать DataFrame обратно в исходную ориентацию.
Используя %timeit
в Jupyter, мы видим, сколько времени занимает обработка этого подхода:
[1]: %timeit df[['col1', 'col3']].T[[0, 2]].T
3.02 ms ± 16.1 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
ПОДХОД 2
Этот подход создаетМаска на основе списка желаемых строк и индекса и фильтрует DataFrame на основе этой маски, а затем выбирает только желаемый столбецнс.Это имеет некоторое сходство с подходом @ jpp, но не использует .loc
.
Аналогично, используя %timeit
... мы видим, что этот подход занимает вдвое меньше, чем подход 1.
[2]: %timeit df[df.index.isin([0, 2])][['col1', 'col3']]
1.61 ms ± 31.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
ПОДХОД 3
Третий подход использует метод .take()
для выбора определенных строк в DataFrame, а затем индексации для нужных столбцов.
СноваИспользуя %timeit
, мы видим, что этот подход в втрое быстрее , чем в подходе 2, и в шесть раз быстрее , чем в подходе 1.
[1]: %timeit df.take([0, 2])[['col1','col3']]
507 µs ± 5.31 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
ЭтоТакже можно утверждать, что этот подход потенциально легче читать, чем первые два подхода.